ARM汇编指令总结
目的
总结目的是为了看懂ARM返汇编程序含义。如果是抱着来看这篇blog的盆友,希望可以帮到你们;如果有错误,请多指出。谢谢!
#
ARM指令的一般格式
arm指令字长为固定的32位。一条典型的arm指令编码格式如下:
一条典型的ARM指令语法格式如下所示:
参数
opcode:指令操作符编码
cond:决定指令的操作是否影响CPSR的值
S:决定指令操作是否影响CPSR的值
Rd:目标寄存器编码
Rn:包含第1个操作数的寄存器编码
shifter_operand表示第2个操作数
汇编指令执行条件
大多数ARM指令都可以条件执行,即根据cpsr寄存器中的条件标志位决定是否执行该指令:如果条件不满足,该指令相当于一条nop执行。
每条ARM指令包含4位条件码域,这表明可以定义16个执行条件。这16个条件码和他们的助记符(标记)如下:
操作数的运算处理方式
一共有下面9种格式:
- [< Rn>, #+/-]
- [< Rn>, +/-< Rm>]
- [< Rn>, +/-< Rm>, < shift>#]
- [< Rn>, #+/-]!
- [< Rn>, +/-< Rm>]!
- [< Rn>, +/-< Rm>, < shift>#]!
- [< Rn>], #+/-
- [< Rn>], +/-< Rm>
- [< Rn>], +/-< Rm>, < shift>#
总结一下我们可以对上面格式分类:例如:1~3为一类,4~6为一类,7~9为一类。同样的,我们也可以这样分类:1,4,7为一类,2,5,8为一类,3,6,9为一类。
例子示范
通过举例子来说明各个类型的意义。
----------------[< Rn>, #+/-<offset_12>]:---------------
LDR R0,[R1, #4] //将内存单元R1+4中的字读取到R0寄存器中。
-------------------[< Rn>, +/-< Rm>]:-------------------
LDR R0,[R1,R2] //将内存单元R1+R2中的字读取到R0寄存器中
----------[< Rn>, +/-< Rm>, < shift>#<offset_imm>]------
LDR R0,[R1,R2, LSL #2] //将地址单元{R1+R2*4}中的数据读取到R0中
-----------------[< Rn>, #+/-<offset_12>]!--------------
LDR R0,[R1, #4] //将内存单元R1+4中的字读取到R0寄存器中
//同时R1=R1+4
---------------------[< Rn>, +/-< Rm>]!-----------------
LDR R0,[R1, R2]! //将内存单元(R1, R2