ARM定址方式

2021-07-25 10:52:13 字數 4727 閱讀 9084

所謂定址方式就是處理器根據指令中給出的位址資訊來尋找實體地址的方式。

arm處理器的定址方式

目前arm處理器支援9種定址方式,分別是立即數定址、暫存器定址、暫存器偏移定址、暫存器間接定址、基址變址定址、多暫存器定址、相對定址、堆疊定址和塊拷貝定址。

1. 立即數定址

也叫立即定址,是一種特殊的定址方式,運算元本身包含在指令中,只要取出指令也就取到了運算元。這個運算元叫做立即數,對應的定址方式叫做立即定址。例如:

movr0,#64 ;r0 ← 64

addr0, r0, #1 ; r0 ← r0 + 1

subr0, r0, #0x3d ; r0 ← r0 – 0x3d

在立即數定址中,要求立即數以「#」為字首,對於以十六進製制表示的立即數,還要求在「#」後加上「0x」或「&」或」0x「。

在arm處理器中,立即數必須對應8位位圖格式,即立即數是乙個在16位或32位的暫存器中的8bit常數,經迴圈移動偶數字得到。合法的立即數必須能夠找到得到它的那個常數,否則這個立即數就是非法的。

例如:0x80是合法的,它可以通過0x80向左或向右移動0位得到,由於8位的常數都可以由其自身移動0位得到,因此8位的立即數都是合法的。

0x03f8也是合法的,把它寫成二進位制形式為:0011

1111

1000,可以看出如果使用0xfe這個8位的常數在16位暫存器中迴圈左移2位就可以得到0x03f8。

判斷乙個立即數是否合法可以用以下的辦法:即對於這個立即數進行循左移或右移操作,看看經過移動偶數字後,是否可以得到乙個不大於0xff的立即數(即不超過8位的立即數),如果可以得到,這個立即數就是合法的,否則就是非法的。象0x1010、0x1fa、0x1ff都是不合法的。

2. 暫存器定址

暫存器定址就是利用暫存器中的數值作為運算元,也稱為暫存器直接定址。

例如:add

r0,r1, r2 ;r0 ← r1 + r2

該指令的執行效果是將暫存器r1和r2的內容相加,其結果存放在暫存器r0中。

這種定址方式是各類微處理器經常採用的一種方式,也是執行效率較高的定址方式。

3. 暫存器間接定址

暫存器間接定址就是把暫存器中的值作為位址,再通過這個位址去取得運算元,運算元本身存放在儲存器中。

例如:ldr r0,[r1]

;r0 ←[r1],以暫存器r1的值作為運算元的位址,把取得運算元傳送到r0中

addr0,r1,[r2]

;r0 ←r1 + [r2],以暫存器r2的值作為運算元的位址,取得運算元後與r1相加,結果存入暫存器r0中。

4. 暫存器偏移定址

這是arm指令集特有的定址方式,它是在暫存器定址得到運算元後再進行移位操作,得到最終的運算元。

例如:mov

r0,r2,lsl

#3 ;r0 ← r2 * 8 ,r2的值左移3位,結果賦給r0。

movr0,r2,lsl

r1 ;r2的值左移r1位,結果放入r0。

可採用的移位操作如下:

lsl:邏輯左移(logical shift left),暫存器中字的低端空出的位補0。

lsr:邏輯右移(logical shift right),暫存器中字的高階空出的位補0。

asl:算術左移(arithmetic shift left),和邏輯左移lsl相同。

asr:算術右移(arithmetic shift right),移位過程中符號位不變,即如果源運算元是正數,則字的高階空出的位補0,否則補1。

ror:迴圈右移(rotate right),由字的低端移出的位填入字的高階空出的位。

rrx:帶擴充套件的迴圈右移(rotate right extended),運算元右移一位,高階空出的位用進製標誌c的值來填充,低端移出的位填入進製標誌位。

5. 暫存器基址變址定址

暫存器基址變址定址又稱為基址變址定址,它是在暫存器間接定址的基礎上擴充套件來的。它將暫存器(該暫存器一般稱作基址暫存器)中的值與指令中給出的位址偏移量相加,從而得到乙個位址,通過這個位址取得運算元。

例如:ldr r0,[r1,#4]

;r0 ←[r1 + 4],將r1的內容加上4形成運算元的位址,取得的運算元存入暫存器r0中。

ldr r0,[r1,#4]!

;r0 ←[r1 + 4]、r1 ←r1 + 4,將r1的內容加上4形成運算元的位址,取得的運算元存入暫存器r0中,然後,r1的內容自增4個位元組。其中!表示指令執行完畢把最後的資料位址寫到r1。

ldr r0,[r1,r2]

;r0 ←[r1 + r2],將暫存器r1的內容加上暫存器r2的內容形成運算元的位址,取得的運算元存入暫存器r0中。

str r0, [r1,#-4]

;r0→[r1 -4],將r1中的數值減4作為位址,把r0中的資料存放到這個位址中。

ldr r0,[r1],#4 ;r0 ←[r1]、r1 ←r1+4

6. 多暫存器定址

這種定址方式可以一次完成多個暫存器值的傳送。例如:

ldmia r0,

ldm:load data from memory to register.

;r1←[r0],r2←[r0+4],r3←[r0+8],r4←[r0+12]

該指令的字尾ia表示在每次執行完載入/儲存操作後,r0按字長度增加,因此,指令可將連續儲存單元的值傳送到r1~r4。

ldmia r0, ;功能同上。

使用多暫存器定址指令時,暫存器子集的順序如果由小到大的順序排列,可以使用「-」連線,否則,用「,」分隔書寫。

7. 相對定址

相對定址是一種特殊的基址定址,特殊性是它把程式計數器pc中的當前值作為基位址,語句中的位址標號作為偏移量,將兩者相加之後得到運算元的位址。

bl next ;相對定址,跳轉到next處執行。

…………

next

……8. 堆疊定址

堆疊是一種資料結構,按先進後出(first in last out,filo)的方式工作,使用堆疊指標(stack pointer, sp)指示當前的操作位置,堆疊指標總是指向棧頂。

根據堆疊的生成方式不同,可以把堆疊分為遞增堆疊和遞減堆疊兩種型別。如下圖所示:

同時,根據堆疊指標(sp)指向的位置,又可以把堆疊分為滿堆疊(full stack)和空堆疊(empty stack)兩種型別。

l 滿堆疊(full stack):堆疊指標指向最後壓入堆疊的資料。滿堆疊在向堆疊存放資料時的操作是先移動sp指標,然後存放資料。在從堆疊取資料時,先取出資料,隨後移動sp指標。這樣保證了sp一直指向有效的資料。

l 空堆疊(empty stack):堆疊指標sp指向下乙個將要放入資料的空位置。空堆疊在向堆疊存放資料時的操作是先放資料,然後移動sp指標。在從堆疊取資料時,是先移動指標,再取資料。這種操作方式保證了堆疊指標一直指向乙個空位址(沒有有效資料的位址)。

上述兩種堆疊型別的組合,可以得到四種基本的堆疊型別,即:

堆疊定址舉例如下:

stmfd sp!,{r1-r7, lr}

stm: store data from register to stack (memory).

;將r1-r7, lr壓入堆疊。滿遞減堆疊。

ldmed sp!,{r1-r7, lr}

;將堆疊中的資料取回到r1-r7, lr暫存器。空遞減堆疊。

9. 塊拷貝定址

塊拷貝定址用於暫存器資料的批量複製,它實現從由基址暫存器所指示的一片連續儲存器到暫存器列表所指示的多個暫存器傳送資料。塊拷貝定址與堆疊定址有所類似。兩者的區別在於:堆疊定址中資料的訪問是面向堆疊的,塊拷貝定址中資料的訪問是面向暫存器指向的儲存單元的。

在塊拷貝定址方式中,基址暫存器傳送乙個資料後有4種增長方式,即:

1.ia:每次傳送後位址增加4;(increment after operating)

2.ib:每次傳送前的位址增加4;(increment before operating)

3.da:每次傳送後位址減少4;(decrement after operating)

4.db:每次傳送前位址減少4。(decrement before operating)

對於32位的arm指令,每次位址的增加和減少的單位都是4 個位元組單位。

例如:stmia r0!,{r1—r7}

;將r1-r7的資料儲存到r0指向的儲存器中,儲存器指標在儲存第乙個值之後增加4,向上增長。r0作為基址暫存器。

stmib r0!,{r1—r7}

;將r1-r7的資料儲存到儲存器中,儲存器指標在儲存第乙個值之前增加4,向上增長。r0作為基址暫存器。

s***a r0!,{r1—r7}

;將r1-r7的資料儲存到r0指向的儲存器中,儲存器指標在儲存第乙個值之後減少4,向下減少。r0作為基址暫存器。

s***b r0!,{r1—r7}

;將r1-r7的資料儲存到儲存器中,儲存器指標在儲存第乙個值之前減少4,向下減少。r0作為基址暫存器。

arm指令中{!},為可選字尾,若選用該字尾,則當資料傳送完畢之後,將最後的位址寫入基址暫存器,否則基址暫存器的內容不改變。

基址暫存器不允許為r15,暫存器列表可以為r0~r15的任意組合。

{^}為可選字尾,當指令為ldm且暫存器列表中包含r15,選用該字尾時表示:除了正常的資料傳送之外,還將spsr複製到cpsr。同時,該字尾還表示傳入或傳出的是使用者模式下的暫存器,而不是當前模式下的暫存器。

ldmia r0,

與ldm ia r0!,的區別?

前一條指令,執行完畢之後,r0的值保持不變;後一條指令執行完畢之後,r0的值發生了變化。

ARM定址方式

arm定址方式定義 處理器根據指令中給出的資訊來找到所需運算元的方式 立即數定址 運算元本身就在指令中給出,只需要取出指令就得到了運算元的方式。運算元稱為立即數 add r0,r0,0x3f r0 r0 3f 第二個數就是運算元,需要用 來作為字首 暫存器定址 運算元存在暫存器中,利用暫存器中的數值...

ARM定址方式

定址方式就是指處理器根據指令中的資訊來找到指令所需的運算元的方式。arm標準彙編中使用分號注釋,gnu彙編使用 注釋 1.立即數定址 是一種特殊的定址方式,運算元就在指令中給出,只要取出指令也就取出了運算元,這個運算元也稱為立即數。add r0,r0,0x3f r0 r0 0x3f在上面這條指令中,...

ARM定址方式

定址方式是指處理器根據指令中給出的位址資訊來尋找實體地址的方式,目前arm指令系統支援以下幾種定址方式 也稱為立即數定址,這種定址方式指令中就已經給出了運算元。也就是在執行指令的過程中,處理器取得指令的同時也取得了運算元,因此稱為立即數定址。例如 add r0,1 r0 1 r0 add r0,r0...