为什么我的编译器将[rbp-4]归零,然后将下面的一个int(argc)保存到堆栈帧中?

时间:2018-08-29 21:38:55

标签: assembly clang x86-64 stackframe

我正在经历一个简单的“ Hello World”程序的自动生成的程序集。它只有一个函数main,并且将字符串作为命令行参数,以便可以打印"Hello [argument given]",然后返回0。main的声明如下:

int main(int argc, char* argv[]){...}

以下是相关组装说明的前几行:

push     rbp                                      
mov rbp, rsp                                  
sub rsp, 32                                  
mov dword ptr [rbp - 4], 0      ; Why is this here?  
mov dword ptr [rbp - 8], edi    ; argc
mov qword ptr [rbp - 16], rsi   ; argv[]
...

我知道前三个是函数“序言”,本质上是为main函数设置一个新的堆栈框架,然后在该堆栈上为main的本地变量腾出空间(例如argcargv)。根据64位Linux约定(我使用的是Mac),这些变量存储在寄存器*di*si中。

但是为什么在将这些值移动到main的堆栈帧之前,将值0移到堆栈帧的前4个字节(rbp-4)中呢?

我最初的猜测是,由于argc是4字节int,因此它存储在32位寄存器edi中(而不是64位{{1} }),因此,如果将main堆栈帧上的该部分内存用作64位指令,则相关指令会将空间的高32位连续存储(在内存中rdi值的上方)位值而不是32位值,以避免在argc上方的堆栈中32位中潜在的垃圾数据。

但这只是一个有根据的猜测,如果在包含此指令后还有其他解释,我将不胜感激。

0 个答案:

没有答案