ARM汇编指令集的特点
扫描二维码
随时随地手机看文章
8种寻址方式
寄存器寻址 mov r1,r2 立即寻址 mov r#0xFF00 寄存器移位寻址 mov r0,r1,lsl #3 寄存器间接寻址 ldr r1,[r2] 基址变址寻址 ldr r1,[r2,#4] 多寄存器寻址 ldmia r1!,{r2-r7,r12} 堆栈寻址 stmfd sp!,(r2-r7,lr) 相对地址 flag:beq flag
指令后缀
B(byte) 功能不变,操作长度变为8位 H(half word) 功能不变,操作长度变为16位 S(signed) 功能不变,操作长度变为有符号 如ldr、ldrb、drh、ldrsb、 S(S标志) 功能不变,影响CPSR标志位 如mov和movs
条件执行后缀
mov r0,r1 0 相当于C语言当中的r0=r1 moveq r0,r1 0 如果eq后缀成立,则直接执行mov r0,r1;如果eq不成立,相当于没有 0 类似于 C语言当中的if(eq){r0=r1}
多级指令流水线
cpsr
:程序状态寄存器,整个CPU只有一个;而SPSR有5个,分别在五种异常模式下,作用是当普通模式进入异常模式
时,用来保存之前普通模式的CPSR的,以在返回普通模式是复原原来的CPSR.
跳转指令
b 直接跳转 bl 跳转前将返回地址保存到lr寄存器,一般用于子程序调用 bx 跳转同时切换到ARM模式,一般用于异常处理的跳转
访存指令
单个字/半字/字节访问ldr/str 多字节访问 ldm/stm 8中后缀 ia (increase after) 先传输,再地址加4 ib (increase before) 先地址加4,再传输 da (dacrease after) 先传输,再地址减4 db (decrease before) 先地址减4,再传输
gun汇编中的一些符号
@用来作注释,可以在行首也可以在代码后面同一行直接跟,和C语言中//类似 #做注释,一般放在行首,表示这一行都是注释而不是代码 :以冒号结尾的是标号 .点号在gun汇编中表示当前指令的地址 #立即数前面要加#或$
常见的gun伪指令
.global_start @给_start外部链接属性 .section.text @指定当前段为代码段 .ascii.byte.short.long.word .quad.float.string @定义数据 .align 4 @以16字节对齐 2^4 .balignl 16,0xabcdefgh @对齐+(位)填充 .equ @类似于C中宏定义 .end @文件结束 .arm/.code 32 @声明以下为arm指令 .thumb/code 16 @声明以下为thumbm指令
最重要的伪指令
ldr 大范围的地址加载指令 adr 小范围的地址加载指令 adrl 中等范围的地址加载指令 ARM中有一个ldr指令,还有一个ldr的伪指令 adr和ldr的差别,ldr加载的地址在链接时确定,而adr加载的地址在运行时确定,所以可以通过adr和ldr加
载的地址来判断程序是否在链接时指定的地址执行