默认情况下,执行指令不会改变CPSR寄存器的状态位,若想改变CPSR寄存器的状态,需要在原指令的后面加上‘ S ’,比如ADD要想在进位时将进位状态保存到CPSR,需要使用指令ADDS。
ADD在做加法运算时,不考虑任何进位,包含了两方面。
ADD R1, R2, R3 @ R1 = R2 + R3 ADD R1, R2, #5 @ R1 = R2 + 5 ADD R1, #7, #5 @ 非法ADD R1, #7, R2 @ 非法注意:正常情况下使用的指令都是ADD,寄存器一次可以处理32bit,如果是处理64bit 的数才会需要用到ADDS 和 ADC。
默认情况下,ADD不会改变CPSR寄存器的状态位置,如果要改变CPSR,需要在原指令的后面加上‘ S ’,也就是指令ADDS。
使用格式和ADD完全一样:
ADDS R1, R2, R3 @ R1 = R2 + R3ADC在做加法运算时,会考虑上一次运算产生的进位。
ADC R1, R2, R3 @ R1 = R2 + R3 + CPSR的C状态位SUB和上面ADD 类 似,在做减法运算时,不考虑任何借位:
SUB R1, R2, R3 @ R1 = R2 - R3SUB R1, R2, #1 @ R1 = R2 - 1SUB产生的借位,默认不保存,即不会更新到CPSR寄存器;如果要更新到CPSR寄存器,需要使用指令SUBS。
SUBS R1, R2, R3 @ R1 = R2 - R3SBC 在做减法运算时,会考虑上一次运算产生的借位
SBC R1, R2, R3 @ R1 = R2 - R3 - (!CPSR的C状态位)减法指令ADD只能是一个寄存器减去一个立即数,逆向减法指令可以让一个立即数减去一个寄存器。但是依然不能违背最初的格式。
RSB R1, R2, #5 @R1 = 5 - R2乘法指令比较特殊,只能是两个寄存器相乘
MUL R1, R2, R3 @R1 = R2 * R3AND R1, R2, R3 @ R1 = R2 & R3ORR R1, R2, R3 @ R1 = R2 | R3EOR R1, R2, R3 @ R1 = R2 ^ R3LSL R1, R2, 1 @ R1 = R2 << 1LSR R1, R2, 1 @ R1 = R2 >> 1上述指令都是可以在C语言中找到对应的,汇编语言也存在自己独有的指令
位清零可以将 “指定比特位” 置 0
MOV R2, #0xFF @ R2 = 0xFF BIC R1, R2, #0x0F @ 将R2后四位清零,结果放入 R1 =》 R1 = R2 & (~0x0F)R2 中保存的是 0xFF,转化成二进制:1111 1111
0x0F 转换 成二进制形式: 0000 1111
最终结果: 1111 0000
0x0F后四位是1,说明要把R2后四位置 0,得到的运算结果放入 R1(0xF0)

MOV R1, R2, LSL #1 MOV 的格式是 MOV <目标寄存器> <第一操作数>
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删