久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 淺述ARM匯編的立即數

淺述ARM匯編的立即數

作者: 時間:2016-11-09 來源:網絡 收藏
大多數的數據處理指令和部分狀態寄存器訪問指令用到立即數,在ARM中不是所有數都能用作立即數;

本文引用地址:http://cqxgywz.com/article/201611/317881.htm

一條典型的ARM匯編語法格式:

{cond}{S} ,,

其中 opcode: 指令助記符,如ADD、SUB、MOV等;
cond: 條件碼助記符,如EQ(0000)、NE(0001)、AL(1110)等;
S:如果指令有S后綴,則該指令的操作會影響CPSR的值;
Rd:目標寄存器;
Rn: 包含第一個源操作數的寄存器;
shifter_operand: 表示第二個源操作數,可以為立即數。

一條典型的ARM匯編編碼格式:

操作數的語法格式:
#
其中,=immed_8循環右移(2*rotate_imm)

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=,rotate_imm=0;
2. 其它情況下,匯編編譯器選擇使rotate_imm的數值最小的編碼方式.

所以0x3f0 是通過 0x3f>>(2*14) 的方式獲得。

LDR偽指令: 裝入32位立即數或地址到寄存器

語法: LDR{} ,=[|label-expr]

expr表示32位常數

eg:

ldr r3,=0xFFF
ldr r1, =12345678



關鍵詞: ARM匯編立即

評論


技術專區

關閉