我正在经历一个简单的“ 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
的本地变量腾出空间(例如argc
和argv
)。根据64位Linux约定(我使用的是Mac),这些变量存储在寄存器*di
和*si
中。
但是为什么在将这些值移动到main的堆栈帧之前,将值0
移到堆栈帧的前4个字节(rbp-4
)中呢?
我最初的猜测是,由于argc
是4字节int
,因此它存储在32位寄存器edi
中(而不是64位{{1} }),因此,如果将main堆栈帧上的该部分内存用作64位指令,则相关指令会将空间的高32位连续存储(在内存中rdi
值的上方)位值而不是32位值,以避免在argc
上方的堆栈中32位中潜在的垃圾数据。
但这只是一个有根据的猜测,如果在包含此指令后还有其他解释,我将不胜感激。