多暫存器和堆疊定址的用法

2021-10-03 13:04:24 字數 1339 閱讀 5975

多暫存器定址:ldmia,ldmib,stmia,stmib,ldmda,ldmdb,s***a,s***b;

堆疊定址:ldmfa,ldmfd,stmfa,stmfd,ldmea,ldmed,stmea,stmed;

ldm批量載入/stm批量儲存指令可以實現一組暫存器和一塊連續的記憶體單元之間傳輸資料。

允許一條指令傳送16個暫存器的任意子集和所有暫存器,指令格式如下:

ldm mode rn, reglist

stm mode rn, reglist

其中:rn:基址暫存器,裝有傳送資料的起始位址,rn不允許為r15;

!:表示最後的位址寫回到rn中;

reglist:可包含多於乙個暫存器範圍,用「,」隔開,如,暫存器由小到大順序排列;

^:不允許在使用者模式和系統模式下執行

主要用途:現場保護、資料複製、引數傳送等,共有8中模式(前面4種用於資料塊的傳輸,後面4種是堆疊操作)如下:

fd: 滿遞減堆疊;

ed: 空遞減堆疊;

fa: 滿遞增堆疊;

ea: 空遞增堆疊。

1、多暫存器定址:

ldmia r0!,

;r1<----[r0]

;r2<----[r0+4]

;r3<----[r0+8]

;r4<----[r0+12]

所有的示例指令執行前:

mem32[0x1000c] = 0x04

mem32[0x10008] = 0x03

mem32[0x10004] = 0x02

mem32[0x10000] = 0x01

r0 = 0x00010010

r1 = 0x00000000

r3 = 0x00000000

r4 = 0x00000000

(1) ldmia r0!,

執行後:

r0 = 0x00100000

r1 = 0x01

r2 = 0x02

r3 = 0x03

(2) ldmib r0!,

執行後:

r0 = 0x00100000

r1 = 0x02

r2 = 0x03

r3 = 0x04

2、堆疊定址:

stmfd入棧指令,相當於s***b

stmfd sp!,

;[sp-4]<—r4

;[sp-8]<—r3

;[sp-12]<—r2

ldmfd出棧指令,相當於ldmia

ldmfd sp!,

;r6<----[sp]

;r7<----[sp+4]

;r8<----[sp+8]

理解LDM和STM多暫存器定址 堆疊指標sp例子

堆疊定址的命令ldmfa stmfa ldmea stmea ldmfd stmfd ldmed stmed。ldm和 stm表示多暫存器定址,即一次可以傳送多個暫存器值。ldm 一次裝載多個,這裡用來出棧。另有,ldr暫存器間接定址 也是裝載r2內容作指標指向的記憶體到r1,如 ldrr1,r2 ...

多暫存器定址指令ldmia ldmib

多暫存器和堆疊定址的用法 多暫存器定址 ldmia,ldmib,stmia,stmib,ldmda,ldmdb,s a,s b 堆疊定址 ldmfa,ldmfd,stmfa,stmfd,ldmea,ldmed,stmea,stmed fd 滿遞減堆疊 ed 空遞減堆疊 fa 滿遞增堆疊 ea 空遞增...

十四 暫存器和定址

1.暫存器分類 2.一共37個暫存器,31個通用暫存器,6個狀態暫存器 其中usr和sys的暫存器很類似 3.通用暫存器 1 不分組暫存器0 7 2 分組暫存器 8 14 3 pc指標 r15 4狀態暫存器 只有在異常模式下,才會既有cpsr又有spsr,usr和sys模式下只有cpsr,為的是保護...