【发布时间】:2017-08-18 05:30:42
【问题描述】:
问题Compilers: Understanding assembly code generated from small programs编译器使用两个局部变量而不调整堆栈指针。
不调整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]。
谁能阐明这个中断问题?硬件是否确实切换到系统堆栈?如何?我的理解有误吗?
【问题讨论】:
-
也许这可能会引起您的兴趣:stackoverflow.com/questions/28759227/…
-
请注意,硬件中断不使用用户堆栈。 kernel stacks can't use a red-zone because HW does clobber asynchronously。用户堆栈仅由软件驱动的事物异步使用:signal 处理程序,以及 GDB 为
print foo()调用函数。
标签: c linux assembly x86-64 red-zone