ARM 堆棧操作

1、寄存器 R13 在 ARM 指令中常用作堆棧指針

2、對於 R13 寄存器來說,它對應6個不同的物理寄存器,其中的一個是用戶模式與系統模式共用,另外5個物理寄存器對應於其他5種不同的運行模式。採用以下的記號來區分不同的物理寄存器:
R13_<mode>
其中,mode爲以下幾種模式之一:usr、fiq、irq、svc、abt、und。


3、寄存器R13在ARM指令中常用作堆棧指針,但這只是一種習慣用法,用戶也可使用其他的寄存器作爲堆棧指針。而在Thumb指令集中,某些指令強制性的要求使用R13作爲堆棧指針。由於處理器的每種運行模式均有自己獨立的物理寄存器R13,在用戶應用程序的初始化部分,一般都要初始化每種模式下的R13,使其指向該運行模式的棧空間,這樣,當程序的運行進入異常模式時,可以將需要保護的寄存器放入R13所指向的堆棧,而當程序從異常模式返回時,則從對應的堆棧中恢復,採用這種方式可以保證異常發生後程序的正常執行。


4、有四種類型的堆棧:

堆棧是一種數據結構,按先進後出(First In Last Out,FILO)的方式工作,使用一個稱作堆棧指針的專用寄存器指示當前的操作位置,堆棧指針總是指向棧頂。

當堆棧指針指向最後壓入堆棧的數據時,稱爲滿堆棧(Full Stack),而當堆棧指針指向下一個將要放入數據的空位置時,稱爲空堆棧(Empty Stack)。

同時,根據堆棧的生成方式,又可以分爲遞增堆棧(Ascending Stack)和遞減堆棧(DecendingStack),當堆棧由低地址向高地址生成時,稱爲遞增堆棧,當堆棧由高地址向低地址生成時,稱爲遞減堆棧。這樣就有四種類型的堆棧工作方式,ARM 微處理器支持這四種類型的堆棧工作方式,即:



◎ Full descending 滿遞減堆棧
堆棧首部是高地址,堆棧向低地址增長。棧指針總是指向堆棧最後一個元素(最後一個元素是最後壓入的數據)。
ARM-Thumb過程調用標準和ARM、Thumb C/C++ 編譯器總是使用Full descending 類型堆棧。

◎ Full ascending 滿遞增堆棧
堆棧首部是低地址,堆棧向高地址增長。棧指針總是指向堆棧最後一個元素(最後一個元素是最後壓入的數據)。


◎ Empty descending 空遞減堆棧
堆棧首部是低地址,堆棧向高地址增長。棧指針總是指向下一個將要放入數據的空位置。


◎ Empty ascending 空遞增堆棧
堆棧首部是高地址,堆棧向低地址增長。棧指針總是指向下一個將要放入數據的空位置。


5、操作堆棧的彙編指令
堆棧類型 入棧指令 出棧指令
Full descending STMFD (STMDB) LDMFD (LDMIA)
Full ascending STMFA (STMIB) LDMFA (LDMDA)
Empty descending STMED (STMDA) LDMED (LDMIB)
Empty ascending STMEA (STMIA) LDMEA (LDMDB)

例子:
STMFD r13!, {r0-r5} ; Push onto a Full Descending Stack
LDMFD r13!, {r0-r5} ; Pop from a Full Descending Stack.

現在通過下表,可以輕鬆的解決這個問題:

尋址方式
說明
pop
=LDM
push
=STM
FA
遞增滿
LDMFA
LDMDA
STMFA
STMIB
FD
遞減滿
LDMFD
LDMIA
STMFD
STMDB
EA
遞增空
LDMEA
LDMDB
STMEA
STMIA
ED
遞減空
LDMED
LDMIB
STMED
STMDA

按照圖表,可知 STMFD對應的是STMDB,根據arm指令手冊,可知STMDB入棧順序是(1方式)

而LDMFD對應的是LDMIA,這樣這兩個操作就可以成功配對:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章