新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM指令中第二操作數(shù)為常數(shù)表達(dá)式時(shí)8位位圖的理解

ARM指令中第二操作數(shù)為常數(shù)表達(dá)式時(shí)8位位圖的理解

作者: 時(shí)間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
一條典型的ARM指令語法格式分為如下幾個(gè)部分:

{} {S} ,{,}
其中,<>內(nèi)的項(xiàng)是必須的,{}內(nèi)的項(xiàng)是可選的,如是指令助記符,是必須的,而{}為指令執(zhí)行條件,是可選的,如果不寫則使用默認(rèn)條件AL(無條件執(zhí)行)。
opcode指令助記符,如LDR,STR 等
cond執(zhí)行條件,如EQ,NE 等
S是否影響CPSR 寄存器的值,書寫時(shí)影響CPSR,否則不影響
Rd目標(biāo)寄存器
Rn第一個(gè)操作數(shù)的寄存器
operand2第二個(gè)操作數(shù)

本文引用地址:http://m.butianyuan.cn/article/201611/318733.htm

其指令編碼格式如下:

31-28

27-25

24-21

20

19-16

15-12

11-0 (12位)

cond

001

opcode

S

Rn

Rd

operand2

對其中的operand2的常數(shù)表達(dá)式有這樣的規(guī)定:“該常數(shù)必須對應(yīng)8位位圖,即常熟是由一個(gè)8位的常熟循環(huán)右移偶數(shù)位得到的。”這句話的意思是說,當(dāng)用12位第二操作數(shù)來表示一個(gè)32位立即數(shù)時(shí),采用的是將8位數(shù)通過移位的方式來實(shí)現(xiàn)的,其中12位第二操作數(shù)的低八位存放被移位的“基本”數(shù)(取值范圍為0到255),而高四位存放的是循環(huán)右移的位數(shù),因?yàn)槲凰奈?strong>二進(jìn)制數(shù),所以取值范圍位為0到15,而對應(yīng)的移位位數(shù)則為0到30位,也就是說若“移位”數(shù)為0,則表示“基本”數(shù)不變,若“移位”數(shù)位1,則表示將“基本”數(shù)在32位數(shù)字空間中循環(huán)右移2位,若“移位”數(shù)位5,則表示將“基本”數(shù)在32位數(shù)字空間中循環(huán)右移10位,若“移位”數(shù)位10,則表示將“基本”數(shù)在32位數(shù)字空間中循環(huán)右移20位,依次類推。舉例表示:
ANDR1,R2,#0xff
當(dāng)處理器處理這條指令的第二操作數(shù)0xff時(shí),因?yàn)?xff為8位二進(jìn)制數(shù),所以處理器就將其直接放進(jìn)8位“基本”數(shù)中,而4位“移位”數(shù)則為0.
ANDR1,R2,#0x104
當(dāng)處理器處理這條指令的第二操作數(shù)0x104時(shí),因?yàn)榇藭r(shí)0x104已經(jīng)超過了8位二進(jìn)制數(shù),所以處理器就要將其“改造”一下,我們先把0x104轉(zhuǎn)換成二進(jìn)制0000 0000 0000 0000 0000 0001 0000 0100,我們可以看到,這個(gè)數(shù)是0000 0000 0000 0000 0000 0000 0100 0001通過循環(huán)右移30位得到的,因此改造后的結(jié)果是8位“基本”數(shù)中存放0100 0001,而“移位”數(shù)為15。
ANDR1,R2,#0xff000000
當(dāng)處理器處理這條指令的第二操作數(shù)0xff000000時(shí),處理器同樣要對其“改造”,我們先把0xff000000轉(zhuǎn)換成二進(jìn)制1111 1111 0000 0000 0000 0000 0000 0000,我們可以看到,這個(gè)數(shù)是0000 0000 0000 0000 0000 0000 1111 1111通過循環(huán)右移8位得到的,因此改造后的結(jié)果是8位“基本”數(shù)中存放1111 1111,而“移位”數(shù)為4。
我想,通過以上的三個(gè)例子,就應(yīng)該明白了8位位圖的原理了。但是,有些數(shù)并不符合8位位圖的原理,這樣的數(shù)在進(jìn)行程序編譯時(shí),系統(tǒng)將會(huì)提示出錯(cuò),下面再舉幾個(gè)違反8位位圖的例子:比如0x101,轉(zhuǎn)換成二進(jìn)制后位0000 0000 0000 0000 0000 0001 0000 0001,像這個(gè)數(shù),無論向右循環(huán)幾位,都無法將兩個(gè)1同時(shí)放到低8位中,因此不符合8位位圖;再比如0x102,轉(zhuǎn)換成二進(jìn)制后位0000 0000 0000 0000 0000 0001 0000 0010,如果將兩個(gè)1同時(shí)放到低8位中,即轉(zhuǎn)換成二進(jìn)制后為0000 0000 0000 0000 0000 0000 1000 0001,需要將此二進(jìn)制數(shù)向右移31位,這也不符合循環(huán)右移偶數(shù)位的條件,因此0x012也不符合8位位圖;再舉一個(gè)0xff1,轉(zhuǎn)換成二進(jìn)制后將會(huì)有9個(gè)1,不可能將其同時(shí)放入8位中,因此當(dāng)然也不符合啦。
通過正反例的比較,可以總結(jié)如下:第一,判斷一個(gè)數(shù)是否符合8位位圖的原則,首先看這個(gè)數(shù)轉(zhuǎn)換成二進(jìn)制后1的個(gè)數(shù)是否不超過8個(gè),如果不超過8個(gè),再看這n個(gè)1(n<=8)是否能同時(shí)放到8個(gè)二進(jìn)制位中,如果可以放進(jìn)去,再看這八個(gè)二進(jìn)制位是否可以循環(huán)右移偶數(shù)位得到起初被判斷的那個(gè)數(shù)值,如果可以,則此數(shù)值即為符合8位位圖原理,否則,不符合。第二,用12位的編碼來表示一個(gè)任意的32位數(shù)是不可能的,只能通過循環(huán)右移八位二進(jìn)制數(shù)偶數(shù)位來得到一部分32位數(shù),其余的無法表示的32位數(shù),只有通過其它途徑獲得了,比如0xffffff00,可以通過0x000000ff按位取反得到,因此在以后的編程中,一定要注意用到的第二操作數(shù)是否符合8位位圖。



評論


技術(shù)專區(qū)

關(guān)閉