1. 程式人生 > 其它 >ARM體系結構與介面技術——ARM指令2——多暫存器記憶體訪問與棧

ARM體系結構與介面技術——ARM指令2——多暫存器記憶體訪問與棧

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