ARM指令中的立即數(shù)
var script = document_createElement_x_x_x_x_x_x_x(script); script.src = http://static.pay.baidu.com/resource/baichuan/ns.js; document.body.a(script);
本文引用地址:http://m.butianyuan.cn/article/201611/319533.htmldr r1, =12345678 編譯器自然會給你做工作,現(xiàn)實的編程中應(yīng)該也是這個居多吧 比較下來, 我們可以這樣總結(jié): 1. 判斷一個數(shù)是否符合8位位圖的原則, 首先看這個數(shù)的二進制表示中1的個數(shù)是否不超過8個. 如果不超過8個, 再看這n個1(n<=8)是否能同時放到8個二進制位中, 如果可以放進去, 再看這八個二進制位是否可以循環(huán)右移偶數(shù)位得到我們欲使用的數(shù). 如果可以, 則此數(shù)符合8位位圖原理, 是合法的立即數(shù). 否則, 不符合. 2. 無法表示的32位數(shù), 只有通過邏輯或算術(shù)運算等其它途徑獲得了. 比如0xffffff00, 可以通過0x000000ff按位取反得到. 因此以后的編程中, 時刻檢查用到的第二操作數(shù)是否符合8位位圖是一件千萬不能疏忽的事. 至于為什么要將這12位 operand2 "八四開", 這個問題就要請教大牛了.??
====繼續(xù):為什么是8位+4為右移?
由于arm指令是固定32位(4字節(jié))的,表示立即數(shù)的只有12位,而要表達32位的立即數(shù),就必須用多條指令才行,假如按常規(guī)思路,立即數(shù)0xFFFFFFFF則這樣表達:
Rn = 立即數(shù)高12位
Rn <<= 12 <--------這里浪費8位立即數(shù)空間,因為12=1010
Rn |=立即數(shù)后12位
Rn <<=12 <--------這里浪費8位立即數(shù)空間,因為12=1010
Rn |=立即數(shù)低8位 <--------這里浪費4位立即數(shù)空間
這樣用5條指令才能將32位的立即數(shù)放入Rn寄存器中,而這樣占用的內(nèi)存=20字節(jié),顯然整個指令鏈太長,而且浪費bit
位。
而arm的設(shè)計正是考慮到了這一點,想出了這個很繞人的解決辦法,且沒有說明思路,導(dǎo)致這里成為了大家的困惑。下面是我分析。
機器碼中立即數(shù)出現(xiàn)得最多的用途是地址,而arm 中要求地址是偶數(shù)對齊。(循環(huán)右移意味著當(dāng)2*rotate_imm大于8的時候,得出的立即數(shù)總是偶數(shù),這樣更有利于表示地址)
4位二進制數(shù)只能右移動16位,顯然不能把立即數(shù)8位完全移動到32位的高24位,所以只好采用先將4位擴展位5位的辦法,即*2處理,這樣就可以把8位立即數(shù)按2粒度移動到32位任一位置,這樣我們只需控制8位的立即數(shù),就可形成任意32位立即數(shù)。
arm 用上面的5位直接在其內(nèi)部按位尋址寄存器相應(yīng)的位,免去了程序中的位移操作,而代價只是編譯過程稍微復(fù)雜了點。
這樣最多用4條指令就可完成上面的例子?
====繼續(xù):ARM匯編編譯器按照下面的規(guī)則來生成立即數(shù)的編碼:?
1、當(dāng)立即數(shù)數(shù)值愛0和0xFF范圍時(8為可以表示的范圍),令imme_8=, rotate_imm=0;?
2、其他情況下,匯編編譯器選擇使rotate_imm數(shù)值最小的編碼方式。?
====增加一點:ARM中應(yīng)該是使用指令碼的25位來判斷第二操作數(shù)的尋址方式:?
第25位(bit[25])為I位,如果I=0,則第2操作數(shù)來自一個立即數(shù),如果I=1,則第2操作數(shù)來自一個寄存器或移位后的寄存器;
評論