ARM體系結構與介面技術——ARM指令2——多暫存器記憶體訪問與棧
阿新 • • 發佈:2022-04-18
ARM體系結構與介面技術——ARM指令2——多暫存器記憶體訪問與棧
棧
- 棧的概念:
- 棧的本質就是一段記憶體,程式執行時用於儲存一些臨時資料。
- 如區域性變數、函式的引數、返回值、以及程式跳轉時需要保護的暫存器等。
- 棧的分類
- 增棧:壓棧時棧指標越來越大,出棧時棧指標越來越小。
- 減棧:壓棧時棧指標越來越大,出棧時棧指標越來越小。
- 滿棧:棧指標指向最後一次壓入到棧中的資料,壓棧時需要先移動棧指標到相鄰位置然後再壓棧。
- 空棧:棧指標指向最後一次壓入到棧中的資料的相鄰位置,壓棧時可直接壓棧,之後需要將棧指標移動到相鄰位置。
- 棧分為空增(EA)、空減(ED)、滿增(FA)、滿減(FD)四種。
- ARM處理器一般使用滿減棧。
ARM多暫存器記憶體訪問
@ 多暫存器記憶體訪問 .text .global _start _start: MOV R1,#1 MOV R2,#2 MOV R3,#3 MOV R4,#4 MOV R11,#0x40000020 @STM R11,{R1-R4} @ 將R1到R4暫存器中的資料儲存到記憶體,以R11為起始地址的記憶體中 @LDM R11,{R6-R9} @ 將以R11為起始地址的記憶體中的資料,儲存到R6-R9暫存器 @ STM指令+字尾可以完成不同的定址方式 @ I和D代表暫存器儲存的地址自動增長和欄位降低 @ A和B代表暫存器 儲存記憶體之後變化 和 儲存記憶體之前變化@STMIA R11!,{R1-R4} @ 先儲存再增長地址 @STMIB R11!,{R1-R4} @ 先增長地址再儲存 @STMDA R11!,{R1-R4} @ 先儲存再降低地址 @STMDB R11!,{R1-R4} @ 先降低地址再儲存 STOP: B STOP .end
基於起始地址為0x40000020,儲存4個位元組,4種定址方式:
暫存器的記憶體訪問實現棧
@ 暫存器的記憶體寫入和讀取操作就是棧的實現
.text .global _start _start: @MOV R1,#1 @MOV R2,#2 @MOV R3,#3 @MOV R4,#4 @MOV R11,#0x40000020
@ 前面提到ARM一般使用的是滿減棧,與之對應的暫存器訪問定址方式就是SMTDB和LDMIA @STMDB R11!,{R1-R4} @ 先降低暫存器地址,再儲存到記憶體 @LDMIA R11!,{R6-R9} @ 先儲存資料到暫存器,再增長地址
@ 編譯器可以實現替換的功能,直接使用滿減棧字尾FD STMFD R11!,{R1-R4} @ 滿減棧壓棧,編譯之後會換成STMDB LDMFD R11!,{R6-R9} @ 滿減棧出棧,編譯之後會換成LDMIA STOP: B STOP .end
棧的應用——C語言函式呼叫
@ 棧的應用:函式呼叫 .text .global _start _start: MOV SP,#0x40000020 @ 初始化棧指標 MAIN: MOV R1,#3 MOV R2,#5 BL FUNC1 ADD R3,R1,R2 B STOP FUNC1: STMFD SP!,{R1,R2,LR} @ 壓棧保護現場 MOV R1,#10 MOV R2,#20 SUB R3,R2,R1 BL FUNC2 LDMFD SP!,{R1,R2,LR} @ 出棧恢復現場 MOV PC,LR FUNC2: STMFD SP!,{R1,R2,LR} @ 壓棧保護現場 MOV R1,#10 MOV R2,#20 ADD R3,R2,R1 LDMFD SP!,{R1,R2,LR} @ 出棧恢復現場 MOV PC,LR STOP: B STOP .end
END