ARM 的堆棧學(xué)習(xí)筆記
掃描二維碼
隨時(shí)隨地手機(jī)看文章
以下是我在學(xué)習(xí)ARM指令中記錄的關(guān)于堆棧方面的知識(shí):
1、寄存器 R13 在 ARM 指令中常用作堆棧指針
2、對(duì)于 R13 寄存器來(lái)說(shuō),它對(duì)應(yīng)6個(gè)不同的物理寄存器,其中的一個(gè)是用戶模式與系統(tǒng)模式共用,另外5個(gè)物理寄存器對(duì)應(yīng)于其他5種不同的運(yùn)行模式。采用以下的記號(hào)來(lái)區(qū)分不同的物理寄存器:
R13_
其中,mode為以下幾種模式之一:usr、fiq、irq、svc、abt、und。
3、寄存器R13在ARM指令中常用作堆棧指針,但這只是一種習(xí)慣用法,用戶也可使用其他的寄存器作為堆棧指針。而在Thumb指令集中,某些指令強(qiáng)制性的要求使用R13作為堆棧指針。由于處理器的每種運(yùn)行模式均有自己獨(dú)立的物理寄存器R13,在用戶應(yīng)用程序的初始化部分,一般都要初始化每種模式下的R13,使其指向該運(yùn)行模式的??臻g,這樣,當(dāng)程序的運(yùn)行進(jìn)入異常模式時(shí),可以將需要保護(hù)的寄存器放入R13所指向的堆棧,而當(dāng)程序從異常模式返回時(shí),則從對(duì)應(yīng)的堆棧中恢復(fù),采用這種方式可以保證異常發(fā)生后程序的正常執(zhí)行。
4、有四種類型的堆棧:堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進(jìn)后出(First In Last Out,F(xiàn)ILO)的方式工作,使用一個(gè)稱作堆棧指針的專用寄存器指示當(dāng)前的操作位置,堆棧指針總是指向棧頂。
當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時(shí),稱為滿堆棧(Full Stack),而當(dāng)堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置時(shí),稱為空堆棧(Empty Stack)。
同時(shí),根據(jù)堆棧的生成方式,又可以分為遞增堆棧(Ascending Stack)和遞減堆棧(DecendingStack),當(dāng)堆棧由低地址向高地址生成時(shí),稱為遞增堆棧,當(dāng)堆棧由高地址向低地址生成時(shí),稱為遞減堆棧。這樣就有四種類型的堆棧工作方式,ARM 微處理器支持這四種類型的堆棧工作方式,即:
◎ Full descending 滿遞減堆棧
堆棧首部是高地址,堆棧向低地址增長(zhǎng)。棧指針總是指向堆棧最后一個(gè)元素(最后一個(gè)元素是最后壓入的數(shù)據(jù))。
ARM-Thumb過(guò)程調(diào)用標(biāo)準(zhǔn)和ARM、Thumb C/C++ 編譯器總是使用Full descending 類型堆棧。
◎ Full ascending 滿遞增堆棧
堆棧首部是低地址,堆棧向高地址增長(zhǎng)。棧指針總是指向堆棧最后一個(gè)元素(最后一個(gè)元素是最后壓入的數(shù)據(jù))。
◎ Empty descending 空遞減堆棧
堆棧首部是低地址,堆棧向高地址增長(zhǎng)。棧指針總是指向下一個(gè)將要放入數(shù)據(jù)的空位置。
◎ Empty ascending 空遞增堆棧
堆棧首部是高地址,堆棧向低地址增長(zhǎng)。棧指針總是指向下一個(gè)將要放入數(shù)據(jù)的空位置。
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.