淺述ARM匯編的立即數(shù)
一條典型的ARM匯編語(yǔ)法格式:
其中 opcode: 指令助記符,如ADD、SUB、MOV等;
cond: 條件碼助記符,如EQ(0000)、NE(0001)、AL(1110)等;
S:如果指令有S后綴,則該指令的操作會(huì)影響CPSR的值;
Rd:目標(biāo)寄存器;
Rn: 包含第一個(gè)源操作數(shù)的寄存器;
shifter_operand: 表示第二個(gè)源操作數(shù),可以為立即數(shù)。
一條典型的ARM匯編編碼格式:
操作數(shù)的語(yǔ)法格式:
#
其中,
immediate: 立即數(shù)
immed_8 : 8位的常數(shù)
rotate_imm: 4位的循環(huán)右移值
意思是每個(gè)立即數(shù)都是由一個(gè)8位的常循環(huán)右移偶數(shù)位得到。
ROR 循環(huán)右移:即將操作數(shù)循環(huán)按指定的數(shù)量向右循環(huán)移位,左邊用右邊移出的位來(lái)填充;
例如:有效的立即數(shù):0x104、0xff0
immediate : 0x104// 0001 0000 0100
immed_8 : 0x81// 0100 0001
左邊補(bǔ)0: 0x00000081// 0000 0000 0000 0000 0000 0000 1000 0001
rotate_imm: 15 // 循環(huán)右移(2*15)位
// 0000 0000 0000 0000 0000 0001 0000 0100
// 0x0000 0104
immediate : 0xff0 // 1111 1111 0000
immed_8: 0xff// 1111 1111
左邊補(bǔ)0: 0x000000ff// 0000 0000 0000 0000 0000 0000 1111 1111
rotate_imm: 14// 循環(huán)右移(2*14)位
// 0000 0000 0000 0000 0000 1111 1111 0000
// 0x0000 0ff0
無(wú)效的立即數(shù)不能通過(guò)上面的構(gòu)造方法得到:0x101、0x102、0xff1
0x101:0001 0000 0001(不能通過(guò)一個(gè)八位常數(shù)獲得)
0x102: 0001 0000 0010(不能通過(guò)移動(dòng)偶數(shù)位獲得)
0xff1: 1111 1111 0001
但是有時(shí)候用出現(xiàn)這種情況,如:0x3f0
可以為:#0x3f,ror (2*14)
或: #0xfc,ror (2*15)
面對(duì)這種情況,ARM有如下規(guī)則:
1. 當(dāng)立即數(shù)的值0-0xFF時(shí),immed_8=
2. 其它情況下,匯編編譯器選擇使rotate_imm的數(shù)值最小的編碼方式.
所以0x3f0 是通過(guò) 0x3f>>(2*14) 的方式獲得。
LDR偽指令: 裝入32位立即數(shù)或地址到寄存器
語(yǔ)法: LDR{
expr表示32位常數(shù)
eg:
ldr r3,=0xFFF
ldr r1, =12345678
評(píng)論