ARM汇编:数据处理指令集:MOV、ADD、ADDS、ADC、
SUB、SUBS、SBC、R。。。
ARM指令集——数据处理指令
数据处理指令有:
MOV、ADD、ADDS、ADC、SUB、
SUBS、SBC、RSB、MUL、AND、
ORR、EOR、BIC、CMP、TST、
TEQ、LSL、LSR、ASR、RORV
数据处理指令语法
1.
<;操作{<cond>}{S}> <Rd>, <Rn>, <Operand2>
2.
<;操作码> <⽬标寄存器Rd> <;第⼀操作寄存器Rn> <;第⼆操作数Operand2>
3.
;第⼀个位置必须是寄存器,第⼆操作数可以是寄存器,也可以是⽴即数
数据传送指令  MOV
1.
mov r1, #0x1  ;r1 = 0x1    0x1 是⽴即数
2.
mov r2, r1  ;r2 = r1
3.
mvn r3, r2  ;r3 = ~r2
4.
mov r1, 0xffffff00  ;0xffffff00 不是⽴即数,只是编译器在编译阶段对其进⾏了替换
5.
mvn r1, 0x000000ff  ;替换的指令
6.
7.
;⼀条数据传送指令 mov reg, #n mov reg占⽤ bit[31:12],bit[11:0]留给⽴即数使⽤,因此⽴即数⾃包含2^12个
8.
;⼀个⽴即数由 bits[8:0]循环右移 2 * bits[11:9]得到。(⼀个⼋位的数循环右移偶数次得到)
9.
;⽴即数的本质是包含于指令中的数,占⽤指令本⾝的空间
加法指令 ADD
1.
;加法指令执⾏时,若没有进位 CPSR 'C' 位置 0
2.
mov r0, #1
3.
mov r1, #1
4.
add r2, r1, r0  ;r2 = r1 + r0
5.
add r2, r1, #2  ;r2 = r1 + 2
数据操作对CPSR的影响
;默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。
2.
mov r1, #0mov r2, #-1
3.
adds r3, r1, r2
带进位的加法指令 ADC
1.
;两个64位数相加,第⼀个64位的低32位放在 r0,⾼位放到 r1,第⼆个64位数的低32位放在 r2 ⾼32位放在 r3 2.
;编写代码实现两个64位数的和,结果的低32位放在 r4 ⾼32位放在 r5
3.
mov r0, #0xfffffffe  ;第⼀个数的低32位
4.
mov r1, #1  ;第⼀个数的⾼32位
5.
mov r2, #0x5  ;第⼆个数的低32位 
6.
mov r3, #1  ;第⼆个数的⾼32位
7.
adds r4, r0, r2
8.
adc r5, r1, r3  ; adc运算的实质是 r5 = r1 + r3 + 'C'  'C'位 CPSR 进位标志
减法指令 SUB
1.
;减法指令执⾏时,没有借位时 CPSR 'C' 位置 1
2.
mov r0, #5
3.
mov r1, #3
4.
sub r2, r0, r1  ;r2 = r0 - r1
带借位的减法指令 SBC
1.
mov r0, #1  ;第⼀个数的低32位
2.
mov r1, #3  ;第⼀个数的⾼32位
3.
mov r2, #3  ;第⼆个数的低32位
4.
mov r3, #1  ;第⼆个输的⾼32位
5.
subs r4, r0, r2 
6.
sbc r5, r1, r3
逆向减法指令 RSB
1.
mov r0, #3
2.
rsb r1, r0, #5  ;r1 = 5 - r0
乘法指令 MUL
1.
;为了提⾼效率,任何乘法指令不可以使⽤⽴即数
2.
mov r0, #3
3.
mov r1, #5
mov r2, r0, r1  ;r2 = r0 * r1
乘——累加指令 MLA
mla r3 ,r0, r1, r2  ;r3 = (r0 * r1) + r2
逻辑与指令 AND
1.
mov r0, #0xf0
汇编指令汇总2.
mov r1, #0x0f
3.
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。
1.
mov r0, #0xf0
2.
mov r1, #0x0f
3.
orr r2, r0, r1 ;r2 = r0 | r1
逻辑异或运算指令 EOR
1.
mov r0, #0xf0
2.
mov r1, #0x0f
3.
eor r2, r0, r1  ;r2 = r0 ^ r1
位清零指令 BIC
指令格式:BIC{cond}{S} Rd,Rn,operand2
BIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到⽬的寄存器Rd 中。指令⽰例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。
1.
mov r0, #0xff
2.
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
最后两个可以作出这种判断的原因是,溢出的本质问题:
两数同为正,相加,值为负,则说明溢出
两数同为负,相加,值为正,则说明溢出
故有,正正得负则溢出,负负得正则溢出
补充:两数相减,同号,则不溢出;两数为异号,结果与减数符号相同,则溢出。
1.
;实质是⼀条减法指令
2.
;没有⽬标register,⽤来⽐较两个数是否相等,结果放到 CPSR 的 'Z' 位判断
3.
mov r0, #2
4.
mov r1, #1
5.
cmp r0, r1
位测试指令 TST
1.
;实质是与运算常⽤于⽤来测试某⼀位或某⼏位是 0 还是 1,结果通过 CPSR 的 'Z' 位判断
2.
tst r0, #0x3
相等测试指令 TEQ
1.
;实质是异或运算,测试两个数是否相等,两个数相等时异或结果位 0,通过 CPSR 的 'Z' 位判断2.
teq r0, r1
移位指令 LSL、LSR、ASR、ROR
1.
;需要与mov配合,不能够单独使⽤
2.
mov r0, #0xff
3.
mov r1, r0, lsl #4  ;将 r0 逻辑左移 4 位放⼊ r1 中
4.
;LSL 逻辑左移:⾼位移出,低位补零
5.
;
LSR 逻辑右移:低位移出,⾼位补零
6.
;ASR 算是右移:低位移出,⾼位补符号位
7.
;ROR 循环右移:低位移出,⾼位补低位移出位

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。