ARM的9種尋址方式


立即尋址

操作數是立即數,以“#”為前綴,表示 16 進制數值時以“0x”表示。

例:

MOV   R0,#0xFF00   ;0xFF00 ->  R0

SUBS   R0,R0,#1     ;R0 – 1 ->  R0

寄存器尋址

操作數的值在寄存器中,指令執行時直接取出寄存器值操作。

例:

MOV  R1,R2      ;R2 -> R1

SUB  R0,R1,R2    ;R1 - R2  ->  R0

 寄存器偏移尋址

當第二操作數是寄存器偏移方式時,第二個寄存器操作數在與第一個操作數結合之前,選擇進行移位操作。

例:

MOV  R0,R2,LSL #3     ;R2 的值左移 3 位,結果放入 R0,即 R0 = R2 * 8

ANDS  R1,R1,R2,LSL #3  ;R2 的值左移 3 位,然后和 R1 相與操作,結果放入 R1

 

可采用的移位操作:

LSL:邏輯左移(Logical Shift Left),低端空出位補 0

LSR:邏輯右移(Logical Shift Right),高端空出位補 0

ASR:算術右移(Arithmetic Shift Right),移位過程中符號位不變,即源操作數為正數,則高端空出位補 0,否則補 1

ROR:循環右移(Rotate Right),由低端移出位填入高端空出位

RRX:帶擴展的循環右移(Rotate Right eXtended by 1 place),操作數右移一位,高端空出位用原 C 標志值填充。

寄存器間接尋址

操作數保存在寄存器指定地址的存儲單元中,即寄存器為操作數的地址指針。

例:

LDR   R1,[R2]   ;將 R2 中的數值作為地址,取出此地址中的數據保存在 R1 中

SWP  R1,R1,[R2] ;將R2中的數值作為地址,取出此地址中的數值與 R1 中的值**

 基址尋址

將基址寄存器的值與偏移量相加,形成操作數的有效地址,基址尋址用於訪問基址附近的存儲單元,常用於查表、數組操作、功能寄存器訪問等。 

例:

LDR    R2,[R3,#0x0F] ;將R3中的數值加 0x0F 作為地址,取此地址的值保存在 R2 中

STR    R1,[R0,#-2] ;將R0中的數值減 2 作為地址,把 R1的值保存到此地址中

 多寄存器尋址

一次傳送多個寄存器值,允許一條指令傳送 16 個寄存器的任何子集或所有寄存器。多寄存器尋址時,寄存器子集按由小到大的順序排列,連續的寄存器可用“-”連接,否則,用“,”分隔書寫。

例:

LDMIA   R1!,{R2-R7,R12} ;將 R1的值讀出到 R2-R7,R12,過程中R1 自動加 1

STMIA   R0!,{R3-R6,R10};將 R3-R6,R10的值保存到 R0 指向的地址,過程中R0 自動加 1

 堆棧尋址

堆棧尋址使用堆棧指針SP,即R13,指向堆棧的棧頂。堆棧可分為兩種:

向上生長:向高地址方向生長,稱為遞增堆棧,

向下生長:向低地址方向生長,稱為遞減堆棧,

堆棧指針指向最后壓入的有效數據項,稱為滿堆棧,

堆棧指針指向下一個要放入的空位置,稱為空堆棧,這樣就有 4 種類型的堆棧。

A)滿遞增:堆棧地址向上增長,堆棧指針指向有效數據的最高地址。如 LDMFA,STMFA。

B)空遞增:堆棧地址向上增長,堆棧指針指向堆棧上的第一個空位置。如 LDMEA,STMEA 。

C)滿遞減:堆棧地址向下增長,堆棧指針指向有效數據項的最低地址。如 LDMFD,STMFD。

D)空遞減:堆棧地址向下增長,堆棧指針指向堆棧下的第一個空位置。如 LDMED,STMED 。

例:

STMFD     SP!,{R1-R7,LR}  ; 將 R1~R7,LR 入棧。滿遞減堆棧。

LDMFD     SP!,{R1-R7,LR}  ;數據出棧,放入 R1~R7,LR 寄存器。滿遞減堆棧。

 塊拷貝尋址

用於將一塊數據從存儲器的某一位置拷貝到另一位置。

例:

STMIA  R0!,{R1-R7}  ;將R1~R7的數據保存到存儲器中,存儲器指針在保存第一個值之后增加,增長方向為向上增長。

STMIB  R0!,{R1-R7}  ;將R1~R7的數據保存到存儲器中,存儲器指針在保存第一個值之前增加,增長方向為向上增長。

STMDA  R0!,{R1-R7}  ;將R1~R7的數據保存到存儲器中,存儲器指針在保存第一個值之后增加,增長方向為向下增長。

STMDB  R0!,{R1-R7}  ;將R1~R7的數據保存到存儲器中,存儲器指針在保存第一個值之前增加,增長方向為向下增長。

 相對尋址

相對尋址是基址尋址的一種變通,由程序計數器 PC 提供基准地址,指令中的地址

碼字段作為偏移量,兩者相加后得到有效地址。

例:

BL    ROUTE1    ;調用ROUTE1 子程序

BEQ   LOOP      ;條件跳轉到 LOOP 標號處

LOOP  MOV R2,#2

ROUTE1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM