浅述ARM汇编的立即数
一条典型的ARM汇编语法格式:
其中 opcode: 指令助记符,如ADD、SUB、MOV等;
cond: 条件码助记符,如EQ(0000)、NE(0001)、AL(1110)等;
S:如果指令有S后缀,则该指令的操作会影响CPSR的值;
Rd:目标寄存器;
Rn: 包含第一个源操作数的寄存器;
shifter_operand: 表示第二个源操作数,可以为立即数。
一条典型的ARM汇编编码格式:
操作数的语法格式:
#
其中,
immediate: 立即数
immed_8 : 8位的常数
rotate_imm: 4位的循环右移值
意思是每个立即数都是由一个8位的常循环右移偶数位得到。
ROR 循环右移:即将操作数循环按指定的数量向右循环移位,左边用右边移出的位来填充;
例如:有效的立即数:0x104、0xff0
immediate : 0x104// 0001 0000 0100
immed_8 : 0x81// 0100 0001
左边补0: 0x00000081// 0000 0000 0000 0000 0000 0000 1000 0001
rotate_imm: 15 // 循环右移(2*15)位
// 0000 0000 0000 0000 0000 0001 0000 0100
// 0x0000 0104
immediate : 0xff0 // 1111 1111 0000
immed_8: 0xff// 1111 1111
左边补0: 0x000000ff// 0000 0000 0000 0000 0000 0000 1111 1111
rotate_imm: 14// 循环右移(2*14)位
// 0000 0000 0000 0000 0000 1111 1111 0000
// 0x0000 0ff0
无效的立即数不能通过上面的构造方法得到:0x101、0x102、0xff1
0x101:0001 0000 0001(不能通过一个八位常数获得)
0x102: 0001 0000 0010(不能通过移动偶数位获得)
0xff1: 1111 1111 0001
但是有时候用出现这种情况,如:0x3f0
可以为:#0x3f,ror (2*14)
或: #0xfc,ror (2*15)
面对这种情况,ARM有如下规则:
1. 当立即数的值0-0xFF时,immed_8=
2. 其它情况下,汇编编译器选择使rotate_imm的数值最小的编码方式.
所以0x3f0 是通过 0x3f>>(2*14) 的方式获得。
LDR伪指令: 装入32位立即数或地址到寄存器
语法: LDR{
expr表示32位常数
eg:
ldr r3,=0xFFF
ldr r1, =12345678
ARM汇编立即 相关文章:
- arm汇编立即数有效位数判断(11-21)
- ARM 汇编中的立即数(11-10)
- ARM汇编中的立即数(11-09)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)