我知道有rules管理堆棧指針在86的修改:在ARM內聯彙編修改SP
超越RSP的當前地址的所有內存被認爲是揮發性:操作系統,或一個調試器,可在用戶調試會話或中斷處理程序期間覆蓋此內存。因此,在嘗試讀取或寫入堆棧幀的值之前,必須始終設置RSP。
我的問題是,ARM的規則是什麼?我在看this代碼(看下面摘錄),它看起來像違反了x86規則(修改內存,然後更改堆棧指針),但這是ARM的問題嗎?
mov r4, sp
sub r4, r4, #128
...
mov r3, #116
1: ldr r7, [r2]
add r2, r2, #4
str r7, [r4]
dd r4, r4, #4
sub r3, r3, #4
cmp r3, #0
ne 1b
sub sp, sp, #128
我試過Google搜索,但找到一個規範,描述修改嵌入式asm ARM棧是...具有挑戰性。有一些關於ARM編譯器和修改堆棧的文檔,但是gcc的規則看起來不同。
@artlessnoise對不起,是的,它是WIndows(添加標籤)。我剛剛意識到代碼不包含任何'.cfi_'指令。這是否意味着這個例程在某些情況下(以某種方式)在異常期間被「跳過」,或者它崩潰了? gcc文檔在哪裏說這是'未定義'(聽起來很有希望)? –
'.cfi_'類型的東西取決於你的二進制規範(COFF/ELF/DWARF,PE-ARM?等)。 [你應該看看編譯器輸出一些'C'代碼引用堆棧/幀](http://stackoverflow.com/questions/37743620/arm-headers-to-get-proper-call-stacks/ )。當然,OS /調試器將執行堆棧遍歷並需要正確的信息。在彙編器堆棧mod之後處理的信號可能導致崩潰。沒有人可以肯定地知道。 –