ARM 堆疊溢位問題

2021-05-21 17:57:50 字數 1258 閱讀 2256

今天一大早就有個師弟在qq上問了我乙個問題, 先把**貼出來.

softwareinterrupt

。。。。。

stmfd sp!,

mov r1, sp

mrs r3, spsr

tst r3, #t_bit ; thumb mode ?

ldrneh r0, [lr,#-2] ; yes, fetch swi no. in thumb mode

bicne r0, r0, #0xff00

ldreq r0, [lr,#-4] ; no, fetch swi no. in arm mode

biceq r0, r0, #0xff000000

cmp r0, #1

ldrlo pc, =osintctxsw

ldreq pc, =__osstarthighrdy

bl swi_exception

ldmfd sp!, ^

這是swi的第一級中斷處理**. 程式很好理解,就不解釋了. 師弟問的這個問題, 倒是這以前沒有想過的.

問題是這樣的:

stmfd   sp!,
他的問題是,如果sp指向的堆疊空間不夠大,溢位怎麼辦?

先來看看sp指向了**. 因為這是swi的中斷處理**, 所自然進入的是管理模式. 一般在啟動**裡會有各個模式下的堆疊的定義和初始化**.所以我們應該會找到類似下面的**.

svc_stack_legth         equ         128

stacksvc dcd svcstackspace + (svc_stack_legth - 1)* 4

svcstackspace space svc_stack_legth * 4

ldr sp, stacksvc

理解了上面四行語句, 再加上你知道arm的堆疊是滿遞減的. 上面的128就夠你放30多個暫存器了(每乙個暫存器是4個位元組)

stmfd   sp!,
這句才放了五個暫存器而已. 也就是說,一般情況下,都是夠用的,不用擔心溢位的問題.

一家之言, 歡迎拍磚.

c語言之堆疊溢位問題

對於c來說,函式呼叫,系統要做三個工作 這裡多提一下,關於陣列作為形參呼叫函式時,為什麼需要連同陣列長度一起傳進來?這裡是因為,陣列作為引數傳遞的本質只是乙個指標,也就是乙個位址,編譯器並不關心這個位址後邊有多少有用資料,編譯器只看得到指標所指的資料。所以在被呼叫函式中,無法直接知道這個陣列的長度,...

JS 倒計時功能 堆疊溢位問題

今天寫前端乙個倒計時功能,我參考了網上的一段 function countdown surplustime,fromtime function checktime i return i 在倒數第二行 var st new date fromtime new date firefox報 too muc...

unsigned char 數值溢位問題

include int main void 在vc 中的輸出結果是 0256 press any key to continue 這說明了 語句 unsigned char 申請的空間 所能儲存的數字的範圍 也就是unsigned char型別所能表示的數的範圍 是 0 255 十進位制 一共 25...