arm汇编指令
1、 跳转指令(主要是分支指令)
分支指令有三种:分支指令B;带链接的分支指令BL(影响LR寄存器);带状态切换的分支指令BX(影响CPSR中的ARM状态和Thumb状态切换)
a) 分支指令——B指令,该指令跳转范围限制在当前指令的±32M字节地址内(ARM指令为字对齐,最低2位地址固定为0)。
例如:B WAITA ;跳转到WAITA标号处,但没有保存返回地址
b) 带链接的分支指令——BL指令适用于子程序调用,使用该指令后,下一条指令的地址(PC-4)被拷贝到R14(即LR) 连接寄存器中,然后跳转到指定地址运行程序。跳转范围限制在当 前指令的±32M字节地址内。
2、 数据处理指令
数据处理指令大致可分为3类:数据传送指令;算术逻辑运算指令;比较指令。
数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据处理指令均可选择使用S后缀,以使指令影响状态标志。
a) 数据传送指令:MOV Rd operand2 ;将operand2的值传递给Rd
当后缀S时,这些指令根据结果更新标志N和Z,在计算Operand2时更新标志C,不影响标志V。
operand2若是立即数,则要求是#immed_8r
例:MOV PC LR ;子程序返回
#immed_8r:立即数寻址方式中,指令中的立即数是由一个8bit的偶数位得到的,每条指令都包含一个8bit的常量X和移位值Y,该立即数=X循环右移(2*Y)。
例如0xFF,0x104,0xFF0,0xF000000F,而0x101(位数超过8bit),0xF000001F(位数超过8bit),0x102(不是右移偶数位)都是无效的立即数。
MVN指令,先取反,再传值
b) 算术指令:
c) 逻辑运算指令:
AND R0,R0,#0x01 ;将除最低位外的位都置为0
ORR R0,R0,#0x0F ;将R0的低4位置1
EOR R1,R1,#0x0F ;将R1的低4位取反
BIC R1,R1,#0x0F ;将R1的低4位清零,其它位不变
d) 比较指令:
CMP指令将寄存器Rn的值减去operand2的值,根据操作的结果更新CPSR中的相应条件标志位(N/Z/C/V),以便后面的指令根据相应的条件标志来判断是否执行。CMP指令与SUBS指令的区别在于CMP指令不保存运算结果。
3、 乘法指令:
4、 程序状态寄存器访问指令
在ARM处理器中,只有MRS指令可以对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以了解当前处理器的工作状态。读SPSR寄存器可以了解到进入异常前的处理器状态。
MRS Rd,psr ;将psr状态寄存器的值读到Rd(将S读到R)
MSR psr_fileds,Rd(或者是#immed_8r) ;将Rd的值写入状态寄存器(将R写入S)
psr:CPSR或SPSR
fileds指定传输的区域,filed可以是以下一种或者多种(字母必须为小写)
c控制域屏蔽字节(psr[7…0])
x扩展域屏蔽字节(psr[15…8])
s状态域屏蔽字节(psr[23…16])
f标志域屏蔽字节(psr[31…24])
5、 加载和存储指令
ARM处理器是典型的RISC处理器,对存储器的访问只能使用加载和存储指令实现。ARM9处理器是冯•诺依曼存储结构,RAM存储空间及I/O映射空间统一编址,除对RAM操作以外,对外围IO、程序数据的访问均要通过加载/存储指令进行。
存储器访问指令分为单寄存器操作指令和多寄存器操作指令。
6、 批量数据加载和存储指令
7、 数据交换指令
8、 移位指令
9、 异常产生指令(软件中断指令)
10、