關於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
001opcode s
rn rd
shifter_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指令。在程式的執行過程中,微處理器可以隨時在兩種工作狀態之間切換,並且,處理器工作狀態的轉變...