ARM指令第二運算元 immed 8r常量問題

2021-05-27 05:04:08 字數 2921 閱讀 2129

**:

在arm

處理器的組合語言中,對指令語法格式中的

的常數表示式有這樣的規定:

「該常數必須對應

8位位圖,即常數是由乙個

8位的常數迴圈移位偶數字得到的。

」首先從

arm指令系統的語法格式說起。 一條

arm指令語法格式分為如下幾個部分:

{} ,

其中,<>

內的項是必須的,

{}內的項是可選的,如

是指令助記符,是必須的,而

{}為指令執行條件,是可選的,如果不寫則使用預設條件

al(無條件執行)。

opcode

指令助記符,如

ldr,

str 等

cond

執行條件,如eq,

ne 等 s

是否影響

cpsr 

暫存器的值,書寫時影響

cpsr

,否則不影響

rd 目標暫存器 rn

第乙個運算元的暫存器

shifter_operand

第二個運算元

其指令編碼格式如下:

31-28

27-25

24-21

20  

19-16

15-12

11-0 (12

位) cond

001opcodesrn

rdshifter_operand

當第2 

個運算元的形式為:#

immed_8r

常數表示式時

「該常數必須對應

8位位圖,即常數是由乙個

8位的常數迴圈移位偶數字得到的。

」其意思是這樣:#

immed_8r

在晶元處理時表示乙個

32位數,但是它是由乙個

8位數(比如:

01011010

,即0x5a

)通過迴圈移位偶數字得到(

1000 0000 0000 0000 0000 0000 0001 0110

,就是0x5a

通過迴圈右移

2位(偶數字)的到的)。 而

1010 0000 0000 0000 0000 0000 0001 0110

,就不符合這樣的規定,編譯時一定出錯。因為你可能通過將

1011 0101

迴圈右移位得到它,但是不可能通過迴圈移位偶數字得到。

1011 0000 0000 0000 0000 0000 0001 0110

,也不符合這樣的規定,很明顯:

1 0110 1011 有9

位。 為什麼要有這樣的規定?

那位大哥的理解是(小呆:這個的確是很有道理):

要從指令編碼格式來解釋(這就是我為什麼一開始講的是指令編碼格式),仔細看**中的

shifter_operand

所佔的位數:

12位。要用乙個

12位的編碼來表示任意的

32位數是絕對不可能的(

12位數有

2^12

種可能,而

32位數有

2^32

種)。

但是又要用

12位的編碼來表示

32位數,怎麼辦?

只有在表示數的數量上做限制。通過編碼來實現用

12位的編碼來表示

32位數。 在

12位的

shifter_operand中:8

位存資料,

4位存移位的次數。 8

位存資料:解釋了

「該常數必須對應

8位位圖」。

4位存移位的次數:解釋了為什麼只能移偶數字。

4位只有

16種可能值,而

32位數可以迴圈移位

32次(

32種可能),那就只好限制:只能移偶數字(兩位兩位地移,好像乙個

16位數在移位,

16種移位可能)。這樣就解決了能表示的情況是實際情況一半的矛盾。

所以對#

immed_8r

常數表示式的限制是解決指令編碼的第二個運算元位數不足以表示

32位運算元的無奈之舉,但在我看來:這個可以說是聰明的做法。因為如果直接用

12位數來表示

32位運算元,只能表示

0 到(

2^12-1

)。大於

(2^12-1)

的數就沒辦法表示了。而且細細想來

「8位存資料,

4位存移位的次數

」,應該是最好的組合了(我並未想過所有的組合,只是順便試了幾個)。

arm指令第二運算元

#immed_8r詳解

大多數arm

通用資料處理指令有乙個靈活的第

2運算元

(flexible second operand),

這裡這解釋一下其中的一種格式,

#immed_8r

常量的表示式。常量必須對應於

8位位圖

(pattern)

。該位圖在

32位字中,被迴圈移位偶數字

(0,2,4,...28,30)

。合法常量

0xff,0xff000,0xf000000f

。非法常量:

0x101,0xff04

arm 在32

位模式下,一條指令長度為

32位,在上述資料處理指令中,運算元2為

12位。所以像

0x7f02

這樣的數,要兩條指令才能完成。

movr3, #0x7f00

;e3 a0 3c 7f 

該指令自己完成

0x7f移位

orrr1, r3, #2

所以直接是找不到

0x7f02的

另外,arm的彙編指令中是沒有迴圈左移的,這個要注意一下。

ARM學習之ARM指令與彙編 二

偽操作是arm組合語言源程式中的特殊指令助記符,其作用是為了完成匯程式設計序做各種準備工作的,指示匯程式設計序對組合語言源程式的編譯操作。是編譯器執行的指令,而不是arm處理器執行的指令。1 用於定義全域性變數的gbla gbll和gbls。2 用於定義區域性變數的lcla lcll和lcls。3 ...

ARM第二課總結

一 arm指令集,六類指令 1 跳轉指令 b 跳轉 blx 帶返回且切換狀態的跳轉 bx 不帶反回,但是有狀態切換的跳轉 條件 eq z置位 相等 ne z清零 不相等 cs c置位 無符號數大於或等於 cc c清零 無符號數小於 mi n置位 負數 pl n清零 正數或零 vs v置位 溢位 vc...

Linux第二課 高階指令

乙個實用的 man.linuxde.net 1 df指令 作用 檢視磁碟空間 語法 df h h表示以可讀性較高的內容展示磁碟空間 2 free指令 作用 檢視記憶體的使用情況 語法 free m m表示以mb為單位進行檢視 3 head指令 作用 檢視乙個檔案的前n行,如果不指定n,則預設顯示前1...