學(xué)習(xí)ARM微處理器中的常量時,一直很懵懂,網(wǎng)上查了一下,終于弄明白,記錄下來先。
書上的原話是:
“常量是一個8位的常數(shù)經(jīng)循環(huán)右移偶數(shù)位(0、2、4、8、…、26、28、30)得到。ARM指令時固定的32位指令編碼,不可能直接用32位表示立即數(shù),采用上述間接方式表示的立即數(shù)在指令編碼中需要12位(其中8位表示常數(shù),4位表示循環(huán)右移)。這樣一來,不是每一個32位常數(shù)都是合法的立即數(shù),只有通過上面的構(gòu)造方法得到的才是合法的立即數(shù)。
合法常量:0xFF、0×104、0xFF000、0xFF000000、0xF000000F。
非法常量:0×101、0×102、0xFF1、0xFF04、0xFF003、0xFFFFFFFF、0xF000001F。”
一開始我納悶:“一個8位的常數(shù)”是什么東西?結(jié)論是:一個8位的任何數(shù),即0×00(0000 0000)~0xFF(1111 1111)都是符合條件的8位常數(shù)。
那么“循環(huán)右移偶數(shù)位”是什么概念?其實是在上述的8位常數(shù)前填加0,補(bǔ)充到32位之后,再循環(huán)右移偶數(shù)位。
舉個例子:
比如0x0F(0000 1111)擴(kuò)充之后為0x0000000F(0000 0000 0000 0000 0000 0000 0000 1111),循環(huán)右移(比如2位)之后為0xC0000003(1100 0000 0000 0000 0000 0000 0000 0011)。故0xC0000003也是一個ARM的合法立即數(shù)。