基本指令介绍
- 数据传送指令
数据传送指令用于在寄存器和储存器中之间进行数据的双向传输 比如:MOV ,MVN
- 算数逻辑运算指令
完成常用的算术与逻辑运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中相应条件表示位 比如:ADD,ADC,SUB,SBC,RSB,RSC,AND,ORR,EOR,BIC
- 比较指令
不保存运算结果,只更新CPSR中相应的条件标志位 比如:CMP,CMN,TST,TEQ
数据传送指令
指令 | 描述 |
---|---|
MOV{条件}{S}目的寄存器,操作数 |
数据传送指令 |
MVN{条件}{S}目的寄存器,操作数 |
数据取反传送指令 |
{S}选项决定指令的操作是否影响CPSR中条件标志位的值
MVN与MOV不同之处是在传送之前按位被取反
__asm__ ("mov ri,r0“); //将寄存器R0的值传送到寄存器R1
__asm__(”mov r1,r0,lsl#3"); //将寄存器R0的值左移3位后传到R1
__asm__(“mov pc,lr"); //将寄存器lr的值传送到pc,常用于子程序返回
__asm__("mvn r0,#0”); // 将立即数0 取反传送到寄存器R0中,完成后R0=-1
比较指令
指令 | 描述 |
---|---|
CMP{条件}操作数1,操作数2 |
比较指令 |
CMN{条件}操作数1,操作数2 |
比较反值指令 |
TST{条件}操作数1,操作数2 |
位测试指令 |
TEQ{条件}操作数1,操作数2 |
相等测试指令 |
比较或者测试时,会影响CPSR寄存器中条件标志位的值
cmp{条件}操作数1,操作数2
cmp指令进行一次减法运算,但不储存结果,只更改条件标志位,
CMN{条件}操作数1,操作数2
CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2相加,并根据结果更改条件标志位n
- 指令示例
| 指令 | 描述|
| --- | --- |
|CMN R1,R0
|将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位|
|CMN R1,#100
|将寄存器R1的值与立即数100相加,并设置响应的CPSR|
TST{条件},操作数1,操作数2
TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值
- 操作数1是是要操作的数据,操作数2是一个位掩码,该指令一般用来检测时候设置了特定的位
- 指令示例
指令 | 描述 |
---|---|
TST R1,#%1 |
用于测试R1中是否设置了最低位,%表示是二进制 |
TST R1,#0xffe |
将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位 |
TEQ{条件} 操作数1,操作数2
TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值
- 该指令通常用于比较操作数1和操作数2是否相等
-
指令示例
指令 | 描述 |
---|---|
TEQ R1,R2 |
将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位 |
算数逻辑运算指令
指令 | 描述 |
---|---|
ADD{条件}{S}目的寄存器,操作数1,操作数2 |
加法指令 |
ADC{条件}{S}目的寄存器,操作数1,操作数2 |
带进位加法指令 |
SUB{条件}{S}目的寄存器,操作数1,操作数2 |
减法指令 |
SBC{条件}{S}目的寄存器,操作数1,操作数2 |
带进位的减法指令 |
RSB{条件}{S}目的寄存器,操作数1,操作数2 |
逆向减法指令 |
RSC{条件}{S}目的寄存器,操作数1,操作数2 |
逆向带进位减法指令 |
AND{条件}{S}目的寄存器,操作数1,操作数2 |
逻辑与运算指令 |
ORR{条件}{S}目的寄存器,操作数1,操作数2 |
逻辑或运算指令 |
EOR{条件}{S}目的寄存器,操作数1,操作数2 |
逻辑异或运算指令 |
BIC{条件}{S}目的寄存器,操作数1,操作数2 |
清理标志位指令 |
ADD{条件}{S}目的寄存器,操作数1,操作数2
加法没什么可说的
ADC{条件}{S}目的寄存器,操作数1,操作数2
带进位的加法,也没什么可以说的,跟x86一样,不过这里加的是CPSR中C标志位的值,但是需要注意的是,需要设置S
条件来更改CPSR的值,否则状态寄存器并不会改变
RSB{条件}{S}目的寄存器,操作数1,操作数2
reverse sub method
逆向减法,是把减法的操作顺序反过来,操作数2减操作数1,并将计算的结果保存到目的寄存器中
RSC{条件}{S}目的寄存器,操作数1,操作数2
带进位的逆向减法,除了逆向的部分跟上面一样外,还要减去CPSR中C标志位的反码,然后将结果保存到目的寄存器中
但是要操作数1寄存器,操作数2可以是寄存器,也可以是立即数,同样的不要忘记设置S
来使CPSR进位
- 指令示例
指令 | 描述 |
---|---|
RSC R0,R1,R2 | R0= R2-R1-!C |
AND{条件}{S}目的寄存器,操作数1,操作数2
逻辑与运算,将操作数1与操作数2进行逻辑与运算,结果保存到目的寄存器
跟x86 的一样,没什么可说的
EOR{条件}{S}目的寄存器,操作数1,操作数2
逻辑异或运算,把结果放到目的寄存器汇中,并且操作数1必须是寄存器 ,操作数2可以是其他的,常用于反转数1的某些位
- 指令示例
指令 | 描述 |
---|---|
EOR R0,R0,#3 | 反转R0的0,1位,其他保持不变,将结果保存到R0中 |
BIC{条件}{S}目的寄存器,操作数1,操作数2
用于清楚操作数1的某些位,并吧结果保存到目的寄存器中。操作数1必须是一个寄存器。操作数2作为一个32位的掩码,如果再掩码中设置了哪一位,就清除这一位,没有设置就保持不变
- 指令示例
指令 | 描述 |
---|---|
BIC R0,R0,#%1011 | 该指令消除R0中的位0,1和3,其他位置保持不变 |
The post 32位ARM汇编语言(四)数据处理指令 appeared first on cole.
http://ift.tt/2DLuJty ArmAsm, ARM, asm, Assembly January 30, 2018 at 09:15AM
评论
发表评论