問題Compilers: Understanding assembly code generated from small programs編譯器使用兩個局部變量而不調整堆棧指針。編譯器使用局部變量而無需調整RSP
不調整RSP的使用局部變量似乎不會中斷安全所以編譯器似乎依靠硬件中斷髮生時自動切換到系統堆棧。否則,出現的第一個中斷會將指令指針壓入堆棧並覆蓋局部變量。
從這個問題的代碼是:
#include <stdio.h>
int main()
{
for(int i=0;i<10;i++){
int k=0;
}
}
由編譯器生成的彙編代碼是:
00000000004004d6 <main>:
4004d6: 55 push rbp
4004d7: 48 89 e5 mov rbp,rsp
4004da: c7 45 f8 00 00 00 00 mov DWORD PTR [rbp-0x8],0x0
4004e1: eb 0b jmp 4004ee <main+0x18>
4004e3: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0
4004ea: 83 45 f8 01 add DWORD PTR [rbp-0x8],0x1
4004ee: 83 7d f8 09 cmp DWORD PTR [rbp-0x8],0x9
4004f2: 7e ef jle 4004e3 <main+0xd>
4004f4: b8 00 00 00 00 mov eax,0x0
4004f9: 5d pop rbp
4004fa: c3 ret
局部變量是在i
和[rbp-0x8]
在k
[rbp-0x4]
。
任何人都可以照亮這個中斷問題嗎?硬件是否切換到系統堆棧?怎麼樣?我的理解錯了嗎?
也許這可能是有趣的:http://stackoverflow.com/questions/28759227/which-stack-is-used-by-interrupt-handler-linux – 4386427