關於ARM處理器中operand2的理解分析

2022-06-23 09:03:17 字數 3377 閱讀 6354

關於arm處理器中operand2的理解分析

寫在前面:轉了幾位大哥的文章做了整理。

在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

的#immed_8r

那個看明白了,但是請問裡的那個

8~11

位的迴圈移位數,

0000

是不移位;

0001

是移動2

位;0010

是移動4

位;0011

是移動6

位這樣子嗎?那麼

0x7f00是7f

左移8位指令中變成

4 7f

請問為什麼老大你給出的是

c 7f

呢?這個大哥犯了乙個錯誤,關於迴圈移位,其實

arm中只有迴圈右移(

ror)。

0x7f

到0x7f00

是通過迴圈右移

24次才實現的,這裡每次移動

2位所以是

12次(

0xc)

0給主人留下些什麼吧!~~

ARM處理器模式

cpsr暫存器 arm v4的cpsr暫存器 和儲存它的spsr暫存器 中的位分配如下圖所示。處理器模式決定了哪些暫存器是活動的以及對cpsr訪問權。處理器模式要麼是特權模式,要麼是非特權模式。特權模式允許對cpsr的完全讀 寫訪問 與些相反,非特權模式只允許對cpsr的控制域進行讀訪問,但允許對條...

ARM處理器型號

arm公司擁有眾多cpu指令集,cpu架構,cpu系列.本文旨在介紹arm公司的cpu產品線.下圖展示了arm公司cpu的產品線 首先有必要了解一下arm公司的命名規則 arm的命名規則,大致分成三類 1.基於arm architecture版本的 指令集架構 命名規則 2.基於arm archit...

arm處理器模式和arm處理器狀態的區別

arm處理器狀態 arm微處理器的工作狀態一般有兩種,並可在兩種狀態之間切換 第一種為arm狀態,此時處理器執行32位的字對齊的arm指令 第二種為thumb狀態,此時處理器執行16位的 半字對齊的thumb指令。在程式的執行過程中,微處理器可以隨時在兩種工作狀態之間切換,並且,處理器工作狀態的轉變...