ARM汇编:数据处理指令集:MOV、ADD、ADDS、ADC、SUB、SUBS、SBC、RSB、MUL、AND、ORR、EOR、BIC、CMP、TST、TEQ、LSL、LSR、ASR、RORV
ARM指令集——数据处理指令
数据处理指令有:
MOV、ADD、ADDS、ADC、SUB、
SUBS、SBC、RSB、MUL、AND、
ORR、EOR、BIC、CMP、TST、
TEQ、LSL、LSR、ASR、RORV
数据处理指令语法
<操作{<cond>}{S}> <Rd>, <Rn>, <Operand2>
<操作码> <目标寄存器Rd> <第一操作寄存器Rn> <第二操作数Operand2>
;第一个位置必须是寄存器,第二操作数可以是寄存器,也可以是立即数
数据传送指令 MOV
mov r1, #0x1 ;r1 = 0x1 0x1 是立即数
mov r2, r1 ;r2 = r1
mvn r3, r2 ;r3 = ~r2
mov r1, 0xffffff00 ;0xffffff00 不是立即数,只是编译器在编译阶段对其进行了替换
mvn r1, 0x000000ff ;替换的指令;一条数据传送指令 mov reg, #n mov reg占用 bit[31:12],bit[11:0]留给立即数使用,因此立即数自包含2^12个
;一个立即数由 bits[8:0]循环右移 2 * bits[11:9]得到。(一个八位的数循环右移偶数次得到)
;立即数的本质是包含于指令中的数,占用指令本身的空间
加法指令 ADD
;加法指令执行时,若没有进位 CPSR 'C' 位置 0
mov r0, #1
mov r1, #1
add r2, r1, r0 ;r2 = r1 + r0
add r2, r1, #2 ;r2 = r1 + 2
数据操作对CPSR的影响
;默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。
mov r1, #0mov r2, #-1
adds r3, r1, r2
带进位的加法指令 ADC
;两个64位数相加,第一个64位的低32位放在 r0,高位放到 r1,第二个64位数的低32位放在 r2 高32位放在 r3
;编写代码实现两个64位数的和,结果的低32位放在 r4 高32位放在 r5
mov r0, #0xfffffffe ;第一个数的低32位
mov r1, #1 ;第一个数的高32位
mov r2, #0x5 ;第二个数的低32位
mov r3, #1 ;第二个数的高32位
adds r4, r0, r2
adc r5, r1, r3 ; adc运算的实质是 r5 = r1 + r3 + 'C' 'C'位 CPSR 进位标志
减法指令 SUB
;减法指令执行时,没有借位时 CPSR 'C' 位置 1
mov r0, #5
mov r1, #3
sub r2, r0, r1 ;r2 = r0 - r1
带借位的减法指令 SBC
mov r0, #1 ;第一个数的低32位
mov r1, #3 ;第一个数的高32位
mov r2, #3 ;第二个数的低32位
mov r3, #1 ;第二个输的高32位
subs r4, r0, r2
sbc r5, r1, r3
逆向减法指令 RSB
mov r0, #3
rsb r1, r0, #5 ;r1 = 5 - r0
乘法指令 MUL
;为了提高效率,任何乘法指令不可以使用立即数
mov r0, #3
mov r1, #5
mov r2, r0, r1 ;r2 = r0 * r1
乘——累加指令 MLA
mla r3 ,r0, r1, r2 ;r3 = (r0 * r1) + r2
逻辑与指令 AND
mov r0, #0xf0
mov r1, #0x0f
and r2, r0, r1 ;r2 = r0 & r1
逻辑或指令 ORR
ORR指令的格式为:ORR{条件}{S} 目的寄存器,操作数1,操作数2
ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1应该是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操作数1的某些位。
指令示例:ORR R0,R0,#3;该指令设置R0的0、1位,其余位保持不变。
orr r0,r0,#0xd3
0xd3=1101 0111
将r0与0xd3作算数或运算,然后将结果返还给r0,即把r0的bit[7:6]和bit[4]和bit[2:0]置为1。
mov r0, #0xf0
mov r1, #0x0f
orr r2, r0, r1 ;r2 = r0 | r1
逻辑异或运算指令 EOR
mov r0, #0xf0
mov r1, #0x0f
eor r2, r0, r1 ;r2 = r0 ^ r1
位清零指令 BIC
指令格式:BIC{cond}{S} Rd,Rn,operand2
BIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。
mov r0, #0xff
bic r0, r0, #0xf ;第二个操作数的每一位为 1 就把第一个操作数对应的位清零
比较指令 CMP
cmp(compare)指令进行比较两个操作数的大小
例:cmp oprd1,oprd2
为第一个操作减去第二个操作数,但不影响第两个操作数的值,它影响flag的CF,ZF,OF,AF,PF
我们怎么判断大小呢?若执行指令后
(1)ZF
ZF=1 这个简单,则说明两个数相等,因为zero为1说明结果为0。
(2)CF
当无符号时:
CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2
CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2
当有符号时:
若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2
若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2
若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2
若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2
最后两个可以作出这种判断的原因是,溢出的本质问题:
两数同为正,相加,值为负,则说明溢出
两数同为负,相加,值为正,则说明溢出
故有,正正得负则溢出,负负得正则溢出
补充: 两数相减,同号,则不溢出;两数为异号,结果与减数符号相同,则溢出。
;实质是一条减法指令
;没有目标register,用来比较两个数是否相等,结果放到 CPSR 的 'Z' 位判断
mov r0, #2
mov r1, #1
cmp r0, r1
位测试指令 TST
;实质是与运算 常用于用来测试某一位或某几位是 0 还是 1,结果通过 CPSR 的 'Z' 位判断
tst r0, #0x3
相等测试指令 TEQ
;实质是异或运算,测试两个数是否相等,两个数相等时异或结果位 0,通过 CPSR 的 'Z' 位判断
teq r0, r1
移位指令 LSL、LSR、ASR、ROR
;需要与mov配合,不能够单独使用
mov r0, #0xff
mov r1, r0, lsl #4 ;将 r0 逻辑左移 4 位放入 r1 中
;LSL 逻辑左移:高位移出,低位补零
;LSR 逻辑右移:低位移出,高位补零
;ASR 算是右移:低位移出,高位补符号位
;ROR 循环右移:低位移出,高位补低位移出位
ARM汇编:数据处理指令集:MOV、ADD、ADDS、ADC、SUB、SUBS、SBC、RSB、MUL、AND、ORR、EOR、BIC、CMP、TST、TEQ、LSL、LSR、ASR、RORV相关推荐
- ARM汇编指令 SUB MOV LDR STR
开启arm汇编学习. 环境介绍:使用的是TI TDA4平台.该平台是基于ARMV8架构,64bit的CPU. 先上一段C代码: #include <stdio.h>int main(voi ...
- ARM汇编指令以及伪指令
文章目录 ARM寄存器 ARM指令的一般编码格式 ARM指令的条件域 ARM寻址方式 数据处理指令的操作数寻址方式 立即数寻址方式 寄存器寻址方式 寄存器移位寻址方式 字或无符号字节的Load/Sto ...
- 【汇编实战开发笔记】ARM汇编基础的三大块知识
文章目录 1 前言 2 ARM知识图谱 3 ARM汇编基础三大块 3.1 寻址方式 3.1.1 立即寻址 3.1.2 寄存器寻址 3.1.3 寄存器偏移寻址 3.1.4 寄存器间接寻址 3.1.5 基 ...
- 【ARM汇编】第三章:ARM指令系统
文章目录 指令基础 指令周期和时序 程序的执行过程 ARM汇编语言 指令和指令格式 指令和指令系统 指令的表示方法 汇编的指令格式 指令的可选后缀 S后缀 !后缀 指令的条件执行 ARM指令分类 AR ...
- 操作符指令 - ARM汇编指令(二)
ARM包含6种重要的数据计算处理指令 数据处理指令格式与条件码 条件码 ARM汇编特点3:指令后缀 同一指令经常附带不同后缀,变成不同的指令.经常使用的后缀有: B(byte)功能不变,操作长度变为8 ...
- 1.15.ARM汇编指令3之逻辑指令
ARM汇编指令之逻辑指令:and & orr & eor & bic * and 逻辑与操作指令,将operand2的值与寄存器Rn的值按位逻辑与操作,结果保存到Rd中. 指令 ...
- arm gnu linux系统,GNU ARM汇编
在大学的时候,汇编就是学的很烂.一是对汇编这门语言没概念,二是那些指令集很难记清楚,用的机会也少,自然学的不好.但是现在觉得相当有必要重头学习一下汇编.部分原因我在上一篇写完设备模型的总结时提到了而. ...
- ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)
[预备知识] ARM处理器的工作模式: Cortex-A寄存器组织概要: 指令: 编译完成后作为一条指令存放在内存单元中,在CPU执行时完成一定的操作. (1) 数据搬移指令:mov.mvn _sta ...
- linux 嵌入式汇编 adc,嵌入式Linux ARM汇编(四)——ARM汇编程序设计
嵌入式Linux ARM汇编(四)--ARM汇编程序设计 汇编程序有顺序.循环.分支.子程序四种结构形式. 一.顺序结构 程序实例: AREA Buf,DATA,READWRITE;定义数据段Buf ...
- ARM汇编:乘法指令集
ARM汇编:乘法指令集
最新文章
- maven java jar_在maven中引入本地jar包的方法
- Windows.etc\hosts文件
- MaskFusion:惊艳的结合实例感知、语义分割、动态追踪的SLAM系统
- 高途发布2020年经德勤审计年报 CFO:16次做空已成谣言
- ES6--Let 和 const 命令
- python教程博客园_python学习(一)—简明python教程
- hdu 动态规划46题
- 【一】如果让我学习TensorFlow,我该怎么学?
- 蚂蚁区块链第19课 联盟链创建及管理
- 2020计算机组成原理课程设计(桂电)
- Xtts v4 xttdriver.pl xtt.properties
- 从0开始构建蓝牙耳机研发环境
- outlook邮箱收件服务器密码,微软邮箱(hotmail+outlook):应用密码获取+STARTTLS加密...
- 如何搭建一个站内搜索引擎(一) 第1章 写在最前
- aix修改日志服务器,配置aix将audit日志发送syslog服务器
- oracle日常运维
- mac下mysql安装,忘记初始临时密码怎么破。
- 内网文件共享服务器方案
- 范围管理-输入、输出、工具和技术
- 锁相环(PLL)专题三:VCO压控振荡器
热门文章
- 嵌入式到底应该选择驱动开发,还是应用开发?
- 用Python玩玩OSMnx包获取道路数据并可视化分析
- 【智库解读】明天系、安邦系、海航系、复星系、联想系、中植系、三胞系、宝能系等27个超级民营金融巨头名单及其持股图揭秘!
- 计算机考数学一英语二的学校,【专硕】初试考数学一的学校统计
- 【计算机组成原理】CPU是什么
- Unity粒子系统-粒子光环
- 微型计算机的一般结构,微型计算机的基本结构
- ​杨利伟:在《太空一日》:我没有看到长城,但祖国的各个省份我大都看到了...
- ble_mesh学习笔记(8) 关于IV index 更新详细理解
- FIFO读数据异常分析