上學期學習了一會兒ARM匯編指令,對其中立即數尋址一節有些疑惑。先看書上的一個例子:
MOV R3, #0x3A ;將十六進制數3A放到寄存器R3中
在上面的指令中,第2個源操作數為立即數,數值可以是0~0xFF范圍內的任意值。
可在平時卻經常看到第2操作數大於0xFF的例子,如 MOV R3, #0x400 等等。
這是為什么呢?網上搜羅一番,果然有很多相關的討論帖子,再加上自己的理解,大致得到了如下的結論。

有興趣的可以去搜一下這一個關鍵詞,8位位圖,原來我們的第2操作數就是遵循這個規律的。
以上的解釋文字來自ARM Processor Instruction Set,再附上兩張圖片:


所以,我們可以這樣總結:
1.判斷一個數是否符合8位位圖的原則,首先看這個數的二進制表示中1的個數是否不超過8個。如果不超過8個,再看這n個1(n<=8)是否能同時放到8個二進制位中,如果可以放進去,再看這八個二進制位是否可以循環右移偶數位得到我們欲使用的數。如果可以,則此數符合8位位圖原理,是合法的立即數。否則,不符合。
2.無法表示的32位數,只有通過邏輯或算術運算等其它途徑獲得了。比如0xFFFFFF00,可以通過0x000000FF按位取反得到。
