ARM堆疊保護 恢復現場分析

2021-09-24 20:05:49 字數 1152 閱讀 2670

根據堆疊的生成方式,又可以分為遞增堆疊(ascending stack)和遞減堆疊(decendingstack),當堆疊由低位址向高位址生成時,稱為遞增堆疊,當堆疊由高位址向低位址生成時,稱為遞減堆疊。這樣就有四種型別的堆疊工作方式,arm 微處理器支援這四種型別的堆疊工作方式,即:

(1) full descending 滿遞減堆疊

堆疊首部是高位址,堆疊向低位址增長。棧指標總是指向堆疊最後乙個元素(最後乙個元素是最後壓入的資料)。

arm-thumb過程呼叫標準和arm、thumb c/c++編譯器總是使用full descending 型別堆疊。

(2) full ascending 滿遞增堆疊

堆疊首部是低位址,堆疊向高位址增長。棧指標總是指向堆疊最後乙個元素(最後乙個元素是最後壓入的資料)。

(3) empty descending 空遞減堆疊

(4) empty ascending 空遞增堆疊

在arm中,一般是滿堆疊,堆疊生長方向是從上向下遞減的(51相反為遞增)。

在寫arm裸板我們會經常寫如下**:

保護現場:

mov ip,sp

stmfdsp!, 等價於 push

sub fp,ip,#4

恢復現場:

sub sp,fp,#12

ldmfd sp,

mov ip,sp 將sp棧指標暫存器儲存在ip暫存器中,stmfd sp!(fp,ip,lr,pc)將fp ip lr pc依次入棧,這樣注意高編號對應高位址入棧,!表示sp也依次偏移(減),sub fp,ip,#4 ip是入棧前sp指向位置的位址,減4是向低位址偏移4個位元組的位置的位址,儲存在fp暫存器中,也就是fp儲存堆疊的頭部的位址。 

sub sp,fp,#12保護現場後sp可能發生變化,通過fp-12可以準確找到儲存現場時sp指向的位置儲存到sp中,ldmfdsp,,從sp指向的位置出棧,fp儲存到fp暫存器中(依然是堆疊的頭部的位址),ip(入棧前sp指向位置的位址)儲存到sp中,相當於恢復了sp的值,lr(下下條指令的位址)儲存到pc中,然後程式從pc指向的位置執行。圖示分析如下:

117 描述函式呼叫的現場保護和現場恢復

首先進入主函式,系統為主函式開闢乙個棧幀,依次入棧 x 10 佔4位元組 y 20 佔4位元組 z 0 佔4位元組 執行到z fun x,y 呼叫子函式fun,開闢子函式fun的棧幀,先將y的值賦值給b,b 20入棧,然後將x的值賦值給a,a 10入棧,然後將主函式的棧底指標入棧,然後將主函式z f...

arm中斷保護和恢復 ARM的中斷處理 一

前面的文章介紹了linux的中斷處理機制,而作業系統的中斷處理是和硬體的中斷控制器緊密相關的,本文將以arm這樣乙個具體的處理器為例,講解硬體層面對中斷的支援。arm的中斷控制器被稱為gic generic interrupt controller 最開始的v1版本最多支援8個pe和1020個中斷源...

arm中斷保護和恢復 ARM中斷異常處理的返回

舉個小例子,下面是一段arm彙編 0x3000bl add 0x3004mov r0,0 0x3008mov r1,1 0x300cmov r2,2 area test,code,readonly entry start mov r0,1 mov r1,1 bl add mov r0,0 mov r...