x86-64呼叫约定,推送基本ptr应为8字节

x86-64呼叫约定,推送基本ptr应为8字节,x86,calling-convention,X86,Calling Convention,在x86-64汇编中,我在我的主函数中看到类似的内容 push %rbp mov %rsp, %rbp mov %edi,-0x14(%rbp) mov %rsi,-0x20(%rbp) movl $0x0,-0x4(%rbp) movl $0x0,-0x8(%rbp) 请注意,它所做的第一件事就是在堆栈上抛出基指针。然后,它将旧的堆栈顶部(rsp)移动到基本ptr寄存器中 我的问题是,最后两行将局部变量初始化为0。它们位于基准ptr的偏移量-4和-8处。但是…

在x86-64汇编中,我在我的主函数中看到类似的内容

push   %rbp 
mov    %rsp, %rbp
mov    %edi,-0x14(%rbp)
mov    %rsi,-0x20(%rbp)
movl   $0x0,-0x4(%rbp)
movl   $0x0,-0x8(%rbp)
请注意,它所做的第一件事就是在堆栈上抛出基指针。然后,它将旧的堆栈顶部(rsp)移动到基本ptr寄存器中


我的问题是,最后两行将局部变量初始化为0。它们位于基准ptr的偏移量-4和-8处。但是…如果旧的基指针位于新基ptr的偏移量0处,这怎么可能呢?旧的基指针应该是8字节长,因为这是一台64位机器。因此,局部变量应该在-0x8(rbp)之前启动。

旧的基指针位于
0(%rbp)
。它通过
7(%rbp)
占用字节
0(%rbp)
-4(%rbp)
处的字节与旧的基指针不重叠。(其他字节
-3(%rbp)
-2(%rbp)
,和
-1(%rbp)
)也一样。

旧的基指针位于
0(%rbp)
。它通过
7(%rbp)
占用字节
0(%rbp)
-4(%rbp)
处的字节与旧的基指针不重叠。(其他字节
-3(%rbp)
-2(%rbp)
,和
-1(%rbp)
)也没有小的修正:这是字节
-4(%rbp)
通过
-1(%rbp)
,因为
movl
移动了32位。我真的只是专注于
-4(%rbp)
字节,但我根据你的建议充实了答案。小更正:这是字节
-4(%rbp)
-1(%rbp)
,因为
movl
移动了32位。我实际上只是专注于
-4(%rbp)
字节,但我根据你的建议充实了答案。