ARM汇编指令-数据处理指令

一、数据传输指令

mov mvn

mov r1, r0 @两个寄存器之间数据传递
mov r1, #0xff @ 将立即数赋值给寄存器
mvn和mov用法一样,区别是mov是原封不动的传递,而mvn是 按位取反后传递
MVN R0, #0 ;把0取反(即-1)传给R0

MVN R1,R2  ;把R2的值取反传给R1

二、算术指令

ADD指令(加法指令)
     ADD{条件}{S}   目的寄存器,  操作数1,   操作数2
     ADD指令用于把两个操作数相加,并将结果存放到目的寄存器中。
     操作数1应是一个寄存器,操作数2可以是一个寄存器、被移位的寄存器、或一个立即数。
     指令示例:
    ADD   R0,  R1,  R2                       ;R0 = R1 + R2
    ADD   R0,  R1,  #256                   ;R0 = R1 + 256
    ADD   R0,  R2,  R3,   LSL #1        ;R0 = R2 + (R3 << 1)
adc(带进位相加)
ADC{条件}{S} 目的寄存器,操作数1,操作数2
ADC指令用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中。
它使用一个进位标志位,这样就可以做比32位大的数的加法,注意不要忘记设置S后缀来更改进位标志。
操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

SUB指令(减法指令)
     SUB{条件}{S}    目的寄存器     操作数1,   操作数2    
     SUB指令用于把操作数1减去操作数2,并将结果存放到目的寄存器中。   
     操作数1应是一个寄存器,操作数2可以是一个寄存器、被移位的寄存器、或一个立即数。   
     指令示例:
    SUB   R0,  R1,  R2                       ;R0 = R1 - R2
    SUB   R0,  R1,  #256                   ;R0 = R1 - 256
    SUB   R0,  R2,  R3,   LSL #1        ;R0 = R2 - (R3 << 1)

SBC指令(带进位相减)
 SBC{条件}{S} 目的寄存器,操作数1,操作数2
SBC指令用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。
操作数1应是一个寄存器,操作数2可以 是一个寄存器,被移位的寄存器,或一个立即数。
该指令使用进位标志来表示借位,这样就可以做大于32位的减法,
注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。
rsb 指令(逆向减法指令)

RSB{条件}{S} 目的寄存器,操作数1,操作数2
RSB指令称为逆向减法指令,用于把操作数2减去操作数1,并将结果存放到目的寄存器中。
操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,

或一个立即数。该指令可用于有符号数或无符号数的减法运算。

rsc 指令(反向带进位减)

    RSC{条件}{S} 目的寄存器,操作数1,操作数2

RSC指令用于把 操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。

操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。

扫描二维码关注公众号,回复: 1689080 查看本文章

该指令可用于有符号数或 无符号数的减法运算


三、逻辑指令

and(逻辑位与)

AND{条件}{S} 目的寄存器,操作数1,操作数2

AND指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。

操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

该指令常用于屏蔽操作数1的某些位。

and r0,r0,#3   @保持R0的0,1位,其他位清零
orr(逻辑位或

ORR{条件}{S} 目的寄存器,操作数1,操作数2

ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。

操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

该指令常用于设置操作数1的某些位

orr r0,r0,#3   @将R0的0,1位置1,其他位保持不变
eor(逻辑位异或)

 EOR{条件}{S} 目的寄存器,操作数1,操作数2

EOR指令用于在两个操作数上进行逻辑异或运算,并把结果放置到目的寄存器中。

操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

该指令常用于反转操作数1的某些位

EOR R0,R0,#3        @该指令反转R0的0、1位,其余位保持不变
bic(位清除指令)
 BIC{条件}{S} 目的寄存器,操作数1,操作数2

BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。

操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。 

操作数2为32位的掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不变

BIC R0,R0,#%1011 @该指令清除 R0 中的位 0 1 3,其余的位保持; %表示是二进制,0x表示十六进制


四、比较指令

CMP指令(比较):

CMP{条件}     操作数1,   操作数2

CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。
该指令进行一次减法(cmp r0, r1  等价于 sub r2, r0, r1 (r2 = r0 - r1))运算,但不存储结果,只更改条件标志位

标志位表示的是操作数1与操作数2的关系(大、小、相等),例如,当操作数1大于操作数2,则此后的有GT后缀的指令将可以执行。

CMN指令:(负数比较)

CMN{条件} 操作数1,操作数2

CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较

同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2相加(cmn r0, r1  等价于 add r0, r1  测试两个数是不是相反数,并根据结果更改条件标志位


TST指令(测试)
TST{条件} 操作数1,操作数2
TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位与运算

并根据运算结果更新CPSR中条件标志位的值。操作数1是要测试的数据,而操作数2是一个位掩码,该指令一般用来检测是否设置了特定的位。
tst r0, #0xf	@测试r0的bit0~bit3是否全为0			

TEQ指令:

TEQ{条件} 操作数1,操作数2

TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算

并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数1和操作数2 是否相等
注意:比较指令不用后加s后缀就可以影响cpsr中的标志位。


五、乘法指令

mvl mla umull umlal smull smlal


https://blog.csdn.net/life_hello/article/details/79993051

https://www.cnblogs.com/bingghost/p/5839022.html

猜你喜欢

转载自blog.csdn.net/wwwlyj123321/article/details/80762417