标签:
ARM指令可以分为数据处理类指令、跳转类指令、异常中断指令、Load/Store指令、协处理器指令、操作CPSR指令等几类。
1、数据处理指令
其中第二个操作数<shifter_operand>可以有三种形式:
(1)立即数形式
立即数是由一个8位常数经过循环右移偶数位所的到的,其中循环偶数位数是由一个4位二进制数的2倍构成。注意并不是所有的立即数数都是合法的立即数。比如0x101就不是一个合法的立即数。
(2)寄存器形式。
(3)寄存器移位形式。
========================================================
2、LDR/STR指令
此类指令可以分为两类:一类是字和无符号字节数据加载存储指令,另一类是半字和有符号字节数据加载存储指令。
其中<address_mode>由基址寄存器和偏移量组成,这两类指令中地址偏移量的形式是不同的,具体如下:
对于字和无符号字节数据的加载和存储,地址偏移量有以下三种形式:
(1)立即数形式
这个立即数和上面的立即数不同,没有那些要求,可以为任何值。但是如果操作字数据的话,要注意偏移量的值必须保证地址对准。如果是字节就不需要了。
(2)寄存器形式
(3)寄存器移位形式
对于半字和有符号字节数据的加载和存储,地址偏移量有以下两种形式:
(1)立即数形式
(2)寄存器形式
结论:半字和有符号字节数据指令比字和无符号字节数据指令少了寄存器移位形式的寻址方式。
扩展:
LDRB/STRB指令:加载/存储无符号字节数据,STRB指令操作的字节数据始终为寄存器的[0:7]位,即最低的字节。LDRB指令从存储器中加载数据到寄存器的最低字节中,然后高位用0补充。
LDRH/STRH指令:加载/存储无符号半字数据,STRH指令操作的字节数据始终为寄存器低16位。LDRH指令从存储器中加载数据到寄存器的低16位中,然后高位用0补充。
LDRSB/STRSB指令:加载/存储有符号字节数据。和LDRB差不多,区别在于从存储器加载字节到寄存器中后高位用符号位来补充。
LDR RD,label这种形式也是允许的,意思是将以标号为地址处的内容加载给rd。
================================================
3、LDM/STM指令:批量传送数据指令
在批量传送数据指令中,有几种操作数据的模式。对于普通存储器中的数据操作,有IA、IB、DA、DB四种模式,对于堆栈的数据操作,有FA、FD、EA、ED四种模式。
FD:满减堆栈。sp指向的空间始终是有数据的,且递减。
FA:满增堆栈。sp指向的空间始终是有数据的,且递增。
EA:空增堆栈。sp指向的空间始终是空的,且递增。
ED:空减堆栈。sp指向的空间始终是空的,且递减。
F:Full。E:Empty。A:增加。D:减小。
IA:同EA相同的模式。
IB:同FA相同的模式。
DA:同ED相同的模式。
DB:同FD相同的模式。
I:增加。D:减小。A:数据操作后改变地址。B:数据操作前改变地址
注意:堆栈的操作模式只对于STM指令,也就是入栈时有效,出栈时只要使用对应的模式就可以了。比如入栈时使用STMFD,相对应的出栈操作就使用LDMFD即可。而对应于普通存储器的操作,则需要对应起来用,比如说存储时使用STMIA,那么加载时使用LDMDB。
ARM指令集(二)
标签:
原文地址:http://www.cnblogs.com/frank-yxs/p/5926204.html