新聞中心

        ARM指令中的立即數(shù)

        作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
        在 ARM 數(shù)據(jù)處理指令中, 當(dāng)參與操作的第二操作數(shù)為立即數(shù)時(shí), 每個(gè)立即數(shù)都是采用一個(gè)8位的常數(shù)循環(huán)右移偶數(shù)位而間接得到, 其中循環(huán)右移的位數(shù)有一個(gè)4位二進(jìn)制的2倍表示. 則有效立即數(shù)可表示為: := immed_8; 循環(huán)右移(2×rotate_imm). 其中: 代表立即數(shù), immed_8 代表8位常數(shù), 即所謂的"8位圖", rotate_imm 代表4位的循環(huán)右移值. 這樣一來(lái)出現(xiàn)了一個(gè)問(wèn)題: 盡管表示的范圍變大了, 但是12位所能表現(xiàn)的數(shù)字的個(gè)數(shù)是一定的. 因此, ARM 規(guī)定并不是所有的32位常數(shù)都是合法的立即數(shù), 只有通過(guò)上面的構(gòu)造方法得到的才是合法的立即數(shù), 編譯的時(shí)候才不會(huì)報(bào)錯(cuò). 舉個(gè)例子吧. 0x3FC(0000 0000 0000 0000 0000 0011 1111 1100) 是由 0xff 循環(huán)右移 2 位得到的; 200(0000 0000 0000 0000 0000 0000 1100 1000) 是由 0xc8 循環(huán)右移 2 位得到的, 它們都是合法的. 而 0x1FE(0000 0000 0000 0000 0000 0001 1111 1110) 和 511(0000 0000 0000 0000 0000 0001 1111 1111) 無(wú)法看成是8位的常數(shù)循環(huán)右移偶數(shù)位而得到的, 因此是非法的. 指令操作數(shù)立即數(shù)時(shí)候,每個(gè)立即數(shù)由一個(gè)8位的常數(shù)循環(huán)右移偶數(shù)位得到。 = immed_8 循環(huán)右移( 2*rotate_imm) 打個(gè)比如: 1.立即數(shù)0xF200是由0xCF2間接表示的,即是由8位的0xF2循環(huán)右移24(2*12)得到的 immed_8 == 0xF2; rotate_imm == 0xC 0000 0000 0000 0000 1111 0010 0000 0000 = = 0000 0000 0000 0000 0000 0000 1111 0010 ->循環(huán)右移24位。 2.立即數(shù)0x3F0是由0xE3F間接表示的,即是由8位的0x3F循環(huán)右移28(2*14)得到的 immed_8 == 0x3F; rotate_imm == 0xE 或者 立即數(shù)0x3F0是由0xFFC間接表示的,即是由8位的0xFC循環(huán)右移30(2*15)得到的 immed_8 == 0xFC; rotate_imm == 0xF 表示方法有好幾種 PS:其實(shí)你沒(méi)必要一個(gè)一個(gè)的算,只要利用LDR偽指令就可以了,例如:

        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://www.104case.com/article/201611/319533.htm

        ldr r1, =12345678 編譯器自然會(huì)給你做工作,現(xiàn)實(shí)的編程中應(yīng)該也是這個(gè)居多吧 比較下來(lái), 我們可以這樣總結(jié): 1. 判斷一個(gè)數(shù)是否符合8位位圖的原則, 首先看這個(gè)數(shù)的二進(jìn)制表示中1的個(gè)數(shù)是否不超過(guò)8個(gè). 如果不超過(guò)8個(gè), 再看這n個(gè)1(n<=8)是否能同時(shí)放到8個(gè)二進(jìn)制位中, 如果可以放進(jìn)去, 再看這八個(gè)二進(jìn)制位是否可以循環(huán)右移偶數(shù)位得到我們欲使用的數(shù). 如果可以, 則此數(shù)符合8位位圖原理, 是合法的立即數(shù). 否則, 不符合. 2. 無(wú)法表示的32位數(shù), 只有通過(guò)邏輯或算術(shù)運(yùn)算等其它途徑獲得了. 比如0xffffff00, 可以通過(guò)0x000000ff按位取反得到. 因此以后的編程中, 時(shí)刻檢查用到的第二操作數(shù)是否符合8位位圖是一件千萬(wàn)不能疏忽的事. 至于為什么要將這12位 operand2 "八四開(kāi)", 這個(gè)問(wèn)題就要請(qǐng)教大牛了.??

        ====繼續(xù):為什么是8位+4為右移?

        由于arm指令是固定32位(4字節(jié))的,表示立即數(shù)的只有12位,而要表達(dá)32位的立即數(shù),就必須用多條指令才行,假如按常規(guī)思路,立即數(shù)0xFFFFFFFF則這樣表達(dá):

        1. Rn = 立即數(shù)高12位

        • Rn <<= 12 <--------這里浪費(fèi)8位立即數(shù)空間,因?yàn)?2=1010

        • Rn |=立即數(shù)后12位

        • Rn <<=12 <--------這里浪費(fèi)8位立即數(shù)空間,因?yàn)?2=1010

        • Rn |=立即數(shù)低8位 <--------這里浪費(fèi)4位立即數(shù)空間

        這樣用5條指令才能將32位的立即數(shù)放入Rn寄存器中,而這樣占用的內(nèi)存=20字節(jié),顯然整個(gè)指令鏈太長(zhǎng),而且浪費(fèi)bit

        位。

        而arm的設(shè)計(jì)正是考慮到了這一點(diǎn),想出了這個(gè)很繞人的解決辦法,且沒(méi)有說(shuō)明思路,導(dǎo)致這里成為了大家的困惑。下面是我分析。

        1. 機(jī)器碼中立即數(shù)出現(xiàn)得最多的用途是地址,而arm 中要求地址是偶數(shù)對(duì)齊。(循環(huán)右移意味著當(dāng)2*rotate_imm大于8的時(shí)候,得出的立即數(shù)總是偶數(shù),這樣更有利于表示地址)

        • 4位二進(jìn)制數(shù)只能右移動(dòng)16位,顯然不能把立即數(shù)8位完全移動(dòng)到32位的高24位,所以只好采用先將4位擴(kuò)展位5位的辦法,即*2處理,這樣就可以把8位立即數(shù)按2粒度移動(dòng)到32位任一位置,這樣我們只需控制8位的立即數(shù),就可形成任意32位立即數(shù)。

        • arm 用上面的5位直接在其內(nèi)部按位尋址寄存器相應(yīng)的位,免去了程序中的位移操作,而代價(jià)只是編譯過(guò)程稍微復(fù)雜了點(diǎn)。

        • 這樣最多用4條指令就可完成上面的例子?

        ====繼續(xù):ARM匯編編譯器按照下面的規(guī)則來(lái)生成立即數(shù)的編碼:?

        1、當(dāng)立即數(shù)數(shù)值愛(ài)0和0xFF范圍時(shí)(8為可以表示的范圍),令imme_8=, rotate_imm=0;?

        2、其他情況下,匯編編譯器選擇使rotate_imm數(shù)值最小的編碼方式。?

        ====增加一點(diǎn):ARM中應(yīng)該是使用指令碼的25位來(lái)判斷第二操作數(shù)的尋址方式:?

        第25位(bit[25])為I位,如果I=0,則第2操作數(shù)來(lái)自一個(gè)立即數(shù),如果I=1,則第2操作數(shù)來(lái)自一個(gè)寄存器或移位后的寄存器;



        關(guān)鍵詞: ARM指令立即

        評(píng)論


        技術(shù)專(zhuān)區(qū)

        關(guān)閉
        主站蜘蛛池模板: 大宁县| 五莲县| 山东省| 金山区| 格尔木市| 布尔津县| 彭山县| 云林县| 海宁市| 玉树县| 苏尼特右旗| 义乌市| 赤壁市| 潢川县| 盐源县| 内江市| 淳化县| 西畴县| 九寨沟县| 张家界市| 山东省| 高碑店市| 遂昌县| 武强县| 广安市| 睢宁县| 呼图壁县| 武隆县| 梅河口市| 大理市| 丰县| 荣昌县| 莫力| 邳州市| 常宁市| 梁河县| 石河子市| 临朐县| 德格县| 乌什县| 大兴区|