版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、arm 堆棧操作arm 堆棧的組織結(jié)構(gòu)是 滿棧降 的形式,滿 棧即 sp 是要停留在最后一個(gè)進(jìn)棧元素, 降: 就是堆棧的增長(zhǎng)方向是從高地址向低地址 發(fā)展。arm 對(duì)于堆棧的操作一般采用 LDMFD (pop )和 STMFD (push) 兩個(gè)命令。 以前困惑的就是 STMFD 命令 對(duì)于操作數(shù) 是按照什么順序壓棧的 比如: STMFD sp !R0-R5 ,LR 進(jìn)棧順序 是:高地址( 1 方式)LRR5R4R0 <-sp 低地址 還是: 高地址( 2 方式)R0R1R5LR v-sp低地址現(xiàn)在通過(guò)下表,可以輕松的解決這個(gè)問(wèn)題:尋 址 方 式說(shuō) 明pop=LDMpush=STMFA遞
2、增 滿LDMFA 1DMDASTMFA汀MIBFD遞 減 滿LDMFDLDMIASTMFDSTMDBEA遞 增 空LDMEALDMDBSTMEASTMIAED遞 減 空LDMEDLDMIBSTMEDSTMDA按照?qǐng)D表,可知 STMFD 對(duì)應(yīng)的是 STMDB , 根據(jù) arm 指令手冊(cè), 可知 STMDB 入棧順序 是( 1 方式)而 LDMFD 對(duì)應(yīng)的是 LDMIA ,這樣這兩個(gè)操 作就可以成功配對(duì):以下是我在學(xué)習(xí)棧方面的知識(shí)ARM 指令中記錄的關(guān)于堆在 ARM 指令中常用作堆1、寄存器 R13 棧指針6中的一個(gè)是用戶模2、對(duì)于 R13 寄存器來(lái)說(shuō),它對(duì)應(yīng) 個(gè)不同的物理寄存器, 式與系統(tǒng)模式共
3、用, 另外 5 個(gè)物理寄存器對(duì) 應(yīng)于其他 5 種不同的運(yùn)行模式。 采用以下的記號(hào)來(lái)區(qū)分不同的物理寄存器:svc 、 abt 、und 。R13_vmode> 其中,mode為以下幾種模式 之一: usr 、fiq、irq、可Thumb 指令集中。 由于處理器的每種運(yùn)R13 ,在般都要初始3、寄存器 R13 在 ARM 指令中常用作 堆棧指針,但這只是一種習(xí)慣用法,用戶也 可使用其他的寄存器作為堆棧指針。而在 ,某些指令強(qiáng)制性的要求使 用 R13 作為堆棧指針 行模式均有自己獨(dú)立的物理寄存器 用戶應(yīng)用程序的初始化部分, 一 化每種模式下的 R13 ,使其指向該運(yùn)行模式 的??臻g,這樣,當(dāng)程
4、序的運(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ù)堆棧的生成方式,又可以分 為遞增堆棧( Ascendi
5、ng 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 ascen
6、ding 滿遞增堆棧堆棧首 部是低地址,堆棧向高地址增長(zhǎng)。 棧指針總 是指向堆棧最后一個(gè)元素 (最后一個(gè)元素是 最后壓入的數(shù)據(jù)) 。 Empty descending 空遞減堆棧堆 棧首部是低(這里是不是錯(cuò)了,應(yīng)該是高地 址吧)地址,堆棧向高地址增長(zhǎng)。棧指針總 是指向下一個(gè)將要放入數(shù)據(jù)的空位置 Empty ascending 空遞增堆棧堆棧 首部是高地址,堆棧向低地址增長(zhǎng)。棧指針 總是指向下一個(gè)將要放入數(shù)據(jù)的空位置。5、操作堆棧的匯編指令堆棧類型入棧指令 出棧指令 Full descending STMFD (STMDB) LDMFD (LDMIA) Full ascending STMFA
7、(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.例子1) 保護(hù)現(xiàn)場(chǎng)參數(shù),不影響 PC ,嵌匯編的 時(shí)候?qū)χ暗拇鎱?shù)的寄存器 R0R12 保 存STMFD r13!, r0-r7,LRLDMFD r13!,
8、 r0-r7,PC2) ARM 匯編中l(wèi)r(r14 )寄存器的作用lr(r14 )的作用問(wèn)題,這個(gè) lr 一般來(lái)說(shuō)有兩 個(gè)作用:1.當(dāng)使用 bl 或者 blx 跳轉(zhuǎn)到子過(guò)程的時(shí)候, r14 保存了返回地址,可以在調(diào)用過(guò)程結(jié)尾 恢復(fù)。2.異常中斷發(fā)生時(shí),這個(gè)異常模式特定的物 理 R14 被設(shè)置成該異常模式將要返回的地 址另外注意 pc ,在調(diào)試的時(shí)候顯示的是當(dāng)前指 令地址,而用 mov lr,pc 的時(shí)候 lr 保存的是 此指令向后數(shù)兩條指令的地址, 大家可以試 一下用 mov pc,pc ,結(jié)果得到的是跳轉(zhuǎn)兩條 指令,這個(gè)原因是由于 arm 的流水線造成 的,預(yù)取兩條指令的結(jié)果 .個(gè)子程序調(diào)用
9、保3.我們看到的 LR 值是 存的子程序返回地址, 這個(gè) LR 是要賦給 PC 的。嵌入式匯編要手動(dòng)保存返回地址, 進(jìn)行現(xiàn) 場(chǎng)保護(hù)。下一條回自己PC 記錄當(dāng)前運(yùn)行的地址+4進(jìn)入子程序, LR 才自動(dòng)更新為返回地址 值, PC 為程序運(yùn)行地址ARM 匯編嵌套子程序Carl Hamacher 、幾個(gè)星期前閱讀了(加)Zvonko Vranesic 、 Safwat Zaky 編寫(xiě)的計(jì) 算機(jī)組成第五版中的 ARM 子程序調(diào)用的 一些知識(shí),啟發(fā)很大,順便將它整理了一 并加入了自己的理解。子程序BR14LR 的 中。 調(diào)用者通1 通過(guò)寄存器傳遞參數(shù) BL 指令通常用于調(diào)用一個(gè)子程序。它和 指令的區(qū)別在于
10、它將返回地址裝載到 中。由于子程序可能是嵌套的,因此 內(nèi)容必須保存在子程序所使用的堆棧 下面的例子使用寄存器傳遞參數(shù)。過(guò)寄存器 R1 和 R2 分別將數(shù)組的大小和數(shù) 組的首地址傳遞給子程序; 子程序利用寄存 器 R0 將和傳遞給調(diào)用者。該子程序使用了 寄存器 R3 ,必須將它和 LR 推入堆棧。 調(diào)用程序 LDR R1, N LDR R2, POINTER BL LISTADD STR R0, SUM子程序 LISTADD STMFD R13!, R3, R14MOV R0, #0 LOOP LDR R3, R2, #4 ADD R0, R0, R3 SUBS R1, R1, #1 BGT L
11、OOP LDMFD R13!, R3, R15 注:這里并沒(méi)有遵守 APCS ( ARM 過(guò)程調(diào) 用標(biāo)準(zhǔn)),一般由調(diào)用者負(fù)責(zé)保存 R0R3 , 被調(diào)用者負(fù)責(zé)保存其他的寄存器以使調(diào)用 返回后程序的狀態(tài)不被破壞。2 通過(guò)堆棧傳遞參數(shù) 調(diào)用程序 LDR R0, POINTER STR R0, R13, #-4! ;將數(shù)組首地址推入堆 棧LDR R0, NSTR R0, R13, #-4! ;將元素個(gè)數(shù) N 推入堆 棧BL LISTADD;將元素和裝載到寄存;恢復(fù)堆棧LDR R0, R13, #4 器R0中STR R0, SUMADD R13, R13, #8子程序R13!, R0-R3, R14LI
12、STADD STMFDLDR R1, R13, #20LDR R2, R13, #24MOV R0, #0 LOOP LDR R3, R2, #4ADD R0, R0, R3SUBS R1, R1, #1BGT LOOPSTR R0, R13,#24;把和推入堆棧的最深處LDMFD R13!, R0-R3, R153嵌套子程序 當(dāng)子程序嵌套時(shí),堆棧是用于處理返回地址 的最合適的數(shù)據(jù)結(jié)構(gòu)。當(dāng)調(diào)用子程序時(shí)在堆 棧上建立了完整的堆棧結(jié)構(gòu)。 應(yīng)當(dāng)注意當(dāng)前 子程序的堆棧幀指針?biāo)赶虻目臻g中存儲(chǔ) 的是調(diào)用當(dāng)前子程序的子程序的堆棧幀指。調(diào)用者將子程序所需要的參數(shù)按照順序 推入堆棧。子程序首先保存工作寄存器、
13、調(diào) 用者的堆棧幀指針以及返回地址,然后它計(jì) 算自己的堆棧幀指針的值( ADD FP, SP, #16),并利用這個(gè)堆棧幀指針從堆棧幀中獲 取調(diào)用者傳遞給它的參數(shù)。在子程序完成它 的任務(wù)之后,它也將返回值保存在堆棧中, 此例保存在參數(shù)所在的內(nèi)存單兀。調(diào)用者和 被調(diào)用者必須約定好參數(shù)的傳遞順序和返值保存位置。如果返回值比較多的話,調(diào)LDR R0, PARAM2R0, SP, #-4!R0, PARAM1R0, SP , #-4! SUB1 LDR R0, SP;將參數(shù)推入堆棧;保存 SUB1 的結(jié)R0, RESULTSP, SP, #8 ;恢復(fù)堆棧用者要為返回值預(yù)先在堆棧中保留合適的 空間。子程序
14、2100 SUB1 STMFD SP!, FP,LRADD LDR LDRR0-R3,LDRSTRFP, SP, #16R0, FP , #8R1, FP , #12;計(jì)算幀指針;載入?yún)?shù) 1 ;載入?yún)?shù)R2, PARAM3R2, SP , #-4!;載入?yún)?shù);將參數(shù) 3 推入堆棧調(diào)用程序 2000 STR LDR STR BL 2020 果 STR ADD3BL SUB2R2中,并遞增SP2164 LDR R2, SP, #4;將 SUB2的結(jié)果彈出并存儲(chǔ)在STR R3, FP , #8;將結(jié)果推入堆棧LDMFD SP!, R0-R3, FP , PC;恢復(fù)寄存 器并返SUB2 STMFD SP!, RO, R1, FP ,3000LRFP, SP, #8R0, FP , #8;載入結(jié)構(gòu)指針;載入?yún)?shù)ADDLDRR1, FP , #8;將結(jié)果推入堆棧STRLDMFD SP!, R0, R1, FP , PCR0SUB1fromR1fromSUB1FPfromSUB12164/ 返口地param3/SUB2 的結(jié)果最后保 存在這里R0 mai
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024美團(tuán)商家入駐平臺(tái)合作協(xié)議及客戶服務(wù)承諾3篇
- 2024熟石灰采購(gòu)合同范本
- 二零二五版高端個(gè)性化二婚離婚補(bǔ)償協(xié)議定制合同
- 2025年度金融科技產(chǎn)品服務(wù)水平協(xié)議2篇
- 2024年項(xiàng)目性勞動(dòng)合同
- 2025版公立醫(yī)療機(jī)構(gòu)與學(xué)校醫(yī)務(wù)室共建項(xiàng)目合同3篇
- 二零二五版民品典當(dāng)借款合同法律適用說(shuō)明4篇
- 租賃合同(2025年度):魚(yú)池場(chǎng)地租賃、養(yǎng)殖技術(shù)指導(dǎo)及分成3篇
- 長(zhǎng)白山職業(yè)技術(shù)學(xué)院《漢字及其教學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 小學(xué)生體育活動(dòng)中的團(tuán)隊(duì)協(xié)作能力培養(yǎng)
- 海外資管機(jī)構(gòu)赴上海投資指南(2024版)
- 山東省青島市2023-2024學(xué)年七年級(jí)上學(xué)期期末考試數(shù)學(xué)試題(含答案)
- 墓地銷(xiāo)售計(jì)劃及方案設(shè)計(jì)書(shū)
- 從偏差行為到卓越一生3.0版
- 優(yōu)佳學(xué)案七年級(jí)上冊(cè)歷史
- 鋁箔行業(yè)海外分析
- 紀(jì)委辦案安全培訓(xùn)課件
- 超市連鎖行業(yè)招商策劃
- 城市道路智慧路燈項(xiàng)目 投標(biāo)方案(技術(shù)標(biāo))
- 【公司利潤(rùn)質(zhì)量研究國(guó)內(nèi)外文獻(xiàn)綜述3400字】
- 工行全國(guó)地區(qū)碼
評(píng)論
0/150
提交評(píng)論