我就自己在學(xué)習arm指令中記錄的關(guān)于隊長(cháng)方面的知識做一個(gè)簡(jiǎn)單的總結,希望對大家有所幫助。1、寄存器 R13 在 arm 指令中常用作堆棧指針
本文引用地址:http://dyxdggzs.com/article/201611/321941.htm2、對于 R13 寄存器來(lái)說(shuō),它對應6個(gè)不同的物理寄存器,其中的一個(gè)是用戶(hù)模式與系統模式共用,另外5個(gè)物理寄存器對應于其他5種不同的運行模式。采用以下的記號來(lái)區分不同的物理寄存器: R13_ 其中,mode為以下幾種模式之一:usr、fiq、irq、svc、abt、und。
3、寄存器R13在arm指令中常用作堆棧指針,但這只是一種習慣用法,用戶(hù)也可使用其他的寄存器作為堆棧指針。而在Thumb指令集中,某些指令強制性的要求使用R13作為堆棧指針。由于處理器的每種運行模式均有自己獨立的物理寄存器R13,在用戶(hù)應用程序的初始化部分,一般都要初始化每種模式下的R13,使其指向該運行模式的??臻g,這樣,當程序的運行進(jìn)入異常模式時(shí),可以將需要保護的寄存器放入R13所指向的堆棧,而當程序從異常模式返回時(shí),則從對應的堆棧中恢復,采用這種方式可以保證異常發(fā)生后程序的正常執行。
4、有四種類(lèi)型的堆棧:
堆棧是一種數據結構,按先進(jìn)后出(First In Last Out,FILO)的方式工作,使用一個(gè)稱(chēng)作堆棧指針的專(zhuān)用寄存器指示當前的操作位置,堆棧指針總是指向棧頂。
當堆棧指針指向最后壓入堆棧的數據時(shí),稱(chēng)為滿(mǎn)堆棧(Full Stack),而當堆棧指針指向下一個(gè)將要放入數據的空位置時(shí),稱(chēng)為空堆棧(Empty Stack)。
同時(shí),根據堆棧的生成方式,又可以分為遞增堆棧(Ascending Stack)和遞減堆棧(DecendingStack),當堆棧由低地址向高地址生成時(shí),稱(chēng)為遞增堆棧,當堆棧由高地址向低地址生成時(shí),稱(chēng)為遞減堆棧。這樣就有四種類(lèi)型的堆棧工作方式,ARM 微處理器支持這四種類(lèi)型的堆棧工作方式,即: ◎ Full descending 滿(mǎn)遞減堆棧堆棧首部是高地址,堆棧向低地址增長(cháng)。棧指針總是指向堆棧最后一個(gè)元素(最后一個(gè)元素是最后壓入的數據)。 ARM-Thumb過(guò)程調用標準和arm、Thumb C/C++ 編譯器總是使用Full descending 類(lèi)型堆棧。
◎ Full ascending 滿(mǎn)遞增堆棧堆棧首部是低地址,堆棧向高地址增長(cháng)。棧指針總是指向堆棧最后一個(gè)元素(最后一個(gè)元素是最后壓入的數據)。
◎ Empty descending 空遞減堆棧堆棧首部是低地址,堆棧向高地址增長(cháng)。棧指針總是指向下一個(gè)將要放入數據的空位置。
◎ Empty ascending 空遞增堆棧堆棧首部是高地址,堆棧向低地址增長(cháng)。棧指針總是指向下一個(gè)將要放入數據的空位置。
5、操作堆棧的匯編指令堆棧類(lèi)型 入棧指令 出棧指令 Full descending STMFD (STMDB) LDMFD (LDMIA) Full ascending STMFA (STMIB) LDMFA (LDMDA) Empty descending STMED (STMDA) LDMED (LDMIB) Empty ascending STMEA (STMIA) LDMEA (LDMDB)
評論