最近學習彙編,遇到乙個問題,我把截圖貼在下面
上面可以看出,相信應該有人感到鬱悶吧,為啥oxffffffff可以識別,而ox1ff卻不行,網上查了好多資料,所以總結一下,
=immed_8迴圈右移(2*rotate_imm)
immediate : 立即數
immed_8 : 8位的常數
rotate_imm : 4位的迴圈右移值(用來存放移位的次數)
簡單的說乙個立即數可以由乙個8位的常數迴圈移位偶數字得到,arm的一條指令是32位,其中
只能用指令機器碼32位中的低12位來表示要操作的常數。arm處理器是按32位來處理資料的,arm處理器處理的資料是32位,如果簡單的用這12位來表示,顯然範圍太小了,為了擴充套件到32位,因此使用了構造的方法,在12位中用8位表示基本資料值,用4位表示位移值,通過用8位基本資料值往右迴圈移動4位位移值*2次,來表示要操作的常數。這裡要強調最終的迴圈次數是4位位移值乘以2得到的,所以得到的最終迴圈次數肯定是乙個偶數,為什麼要乘以2呢,實質還是因為範圍不夠,4位表示位移次數,最大才15次,加上8位資料還是不夠32位,這樣只能通過alu的內部結構設計將4位位移次數乘以2,這樣就能用12位表示32位常數了。
立即數的判斷?
0x1fc(0000 0000 0000 0000 0000 0001 1111 1100) 1的位數小於8,滿足要求
而 0x1ff(0000 0000 0000 0000 0000 0001 1111 1111)
是非法的
而0xffffffff雖然不滿足立即數的條件,但它滿足有效數條件。對於有效數,它的反碼滿足立即數的條件,編譯器會自動的把它變換為mvn r1, #0,所以乙個數是立即數或者乙個數的反碼是立即數的都可以滿足條件。
當然也可以使用偽指令滿足我們的要求,當然了,這樣做是有弊端的,
ldr r1, =count
ldr r1, =0x1ff
關於ARM立即數的理解
一 立即數指令碼的組成 arm公司將32bit指令碼分為如下兩部分 32bit立即數通過imm8值迴圈右移ror值 2bit得到。即 shifter operand immed 8 rotate right rotate imm 2 二 如何判斷乙個數是否是合法立即數?首先將這個數轉換為32bit1...
ARM彙編立即數合法性
每個立即數由乙個8位的常數迴圈右移偶數字得到。其中迴圈右移的位數由乙個4位二進位制的兩倍表示。則有 immed 8迴圈右移 2 rotate imm 並不是每乙個32位得常數都是合法的立即數,只有能通過上面構造方法得到的才是合法的立即數。arm彙編編譯器按照下面的規則來生成立即數的編碼。1 當立即數...
ARM中判斷立即數是否有效
在arm立即數定址中,指令中的立即數是有乙個8位的常熟和移動的4 位偶數字得到的,所以每一條指令都包含乙個常數x和移位值y,得到的立即數 x迴圈右移 2 y 給定乙個立即數,判斷其是否合法可以分三步 首先將給定的立即數寫成32位二進位制的形式 然後看能不能用乙個8位的二進位制數包括所有含1的部分,如...