ARM汇编2
一. 数据处理汇编指令
1.1. 数据传输指令
1.1.1. mov(Move) 指令
示例:mov r0, r0, LSL#3 ; r0 = r0* 8
mov pc, r14 ; 退出到调用者
movs PC, r14 ; 退出到调用者并恢复标志位
1.1.2. mvn(move negative)指令
示例:mvn r0, #4 ; r0 = -5
mvn r0, #0 ; r0 = -1
1.2. 算术指令
1.2.1. add 指令
示例:add r0, r1, r2 ; r0 = r1 + r2
add r0, r1, #256 ; r0 = r1 + 256
add r0, r2, r3,lsl #1 ; r0 = r2 + (r3 << 1)
ps:带进位的加法ADC
1.2.2. sub指令
示例: sub r0, r1, r2 ; r0 = r1 - r2
sub r0, r1, #256 ; r0 = r1 - 256
sub r0, r2, r3 , lsl , #1 ; R0 = R2 - (R3 << 1)
ps:带进位的减法sbc
1.2.3. mul指令
示例:mul r0,r1,r2; r0=r1*r2
mul r0,r1,#3 ;r0=r1*3
1.3. 位操作指令
1.3.1. and 位与
示例:and r0,r1,r2 ; r0=r1 & r2
and r0,r1,#0xFF ;r0=r1 & 0xFF
1.3.2. orr 位或指令
示例:orr r0,r1,r2 ; r0=r1 | r2
orr r0,r1,#0xFF ;r0=r1 | 0xFF
1.3.3. bic 清位操作
示例:bic r0,r0,#0xF ; 等同于 r0 &=~(0xF)
bic r0,r0,#%1011 ; 该指令清除 r0 中的位 0 1 3,其余的位保持; %表示是二进制,0x表示十六进制
1.4. 比较指令
1.4.1. cmp与cmn指令
a. cmp和cmn比较两个操作数,并把结果存入cpsr供下一句语句使用。比较指令不用后加s后缀就可以影响cpsr中的标志位。
示例:cmp cmp r0, r1 等价于 subs r2, r0, r1 (r2 = r0 - r1)
cmn cmn r0, r1 等价于 adds r2,r0, r1 (r2 = r0 + r1)
1.4.2. tst指令
a. tst测试某一位是否为1,并把结果写入cpsr,供下一句使用
示例:tst r1,#0xffe; 等同于if(r1 & 0xffe)
tst r1,#%1;测试最低位是否为1,%表示二进制
1.5. cpsr访问指令
1.5.1. mrs指令
a. mrs指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下两种情冴:
Ⅰ.当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
Ⅱ.当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
示例:mrs r0,cpsr @传送cpsr的内容到r0
mrs r0,spsr @传送spsr的内容到r0
1.5.2. msr指令
a. msr指令用亍将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域:
位[31:24]为条件标志位域,用f表示;
位[23:16]为状态位域,用s表示;
位[15:8]为扩展位域,用x表示;
位[7:0]为控制位域,用c表示;
示例:msr cpsr,r0 @传送r0的内容到cpsr
msr spsr,r0 @传送r0的内容到spsr
msr cpsr_c,r0 @传送r0的内容到spsr,但仅仅修改cpsr中的控制位域
1.6.跳转指令
1.6.1. b指令
a. b指令(Branch)表示无条件跳转(就没打开算返回)
示例:b main ;跳转到标号为main地代码处.
1.6.2. bl指令
a. bl指令(Branch with Link)表示带返回值的跳转
b. bl比b多做一步,在跳转前,bl会把当前位置保存在r14(即lr寄存器),当跳转代码结束后,用mov pc,lr指令跳回来,这实际上就是C语言执行函数的用法,
汇编里调子程序都用BL,执行完子函数后,可以用mov pc,lr跳回来
示例:bl delay ;执行子函数或代码段delay ,delay可以为C函数.
1.7. 多寄存器语句传输指令
1.7.1. ldm指令
示例:ldmia r0! ,{r3-r9} ;加r0指向的地址上连续空间的数据,保存到r3-r9当中,!表示r0值更新,ia后缀表示按WORD递增
ldmfd sp!,{r0-r7,pc}^;恢复现场,异常处理返回,^表示不允许在用户模式下使用。
1.7.2. stm指令
示例:stmia r1!,{r3-r9} ;将r3-r9的数据存储到r1指向的地址上,r1值更新。
stmfd sp!,{r0-r7,lr}; 现场保存,将r0~r7,lr入栈
stmfd sp!,{r8-r9},把sp寄存器对庆的地址的值存到r8,r9当中.!表示最后的值写入sp中。
1.8. 其他指令
1.8.1. swp指令
a. 寄存器和存储器交换指令
swp r1,r1,[r0] ;取出r0地址中的数据,放在r1中,并把r1中的数据放在r0中。
1.8.2. swi指令
a. 软中断指令用来实现操作系统中系统调用
1.9. 合法立即数与非法立即数
1.9.1. ARM指令都是32位,除了指令标记和操作标记外,本身只能附带很少位数的立即数。因此立即数有合法和非法之分
1.9.2. 合法立即数:经过任意位数的移位后非零部分可以用8位表示的即为合法立即数