c++ - 为什么函数序言中没有 "mov rsp, rbp"?

标签 c++ c assembly

在汇编中,许多函数以下面的序言开始:

00000001004010e0: main(int, char**)+0    push    %rbp
00000001004010e1: main(int, char**)+1    mov     %rsp,%rbp

有些功能,例如下面的功能,不会:

                              int MainEntry(){
                                       MainEntry():
0000000100401104: MainEntry()+0          push    %rbp
0000000100401105: MainEntry()+1          push    %rbx
0000000100401106: MainEntry()+2          sub     $0x48,%rsp
000000010040110a: MainEntry()+6          lea     0x80(%rsp),%rbp
                                        vector<int> v;
0000000100401112: MainEntry()+14         lea     -0x60(%rbp),%rax
0000000100401116: MainEntry()+18         mov     %rax,%rcx
0000000100401119: MainEntry()+21         callq   0x100401b00 <std::vector<int, std::allocator<int> >::vector()>
                                        return 0;
000000010040111e: MainEntry()+26         mov     $0x0,%ebx
0000000100401123: MainEntry()+31         lea     -0x60(%rbp),%rax
0000000100401127: MainEntry()+35         mov     %rax,%rcx
000000010040112a: MainEntry()+38         callq   0x100401b20 <std::vector<int, std::allocator<int> >::~vector()>
000000010040112f: MainEntry()+43         mov     %ebx,%eax
                                     }

这是编译成这个的 C++ 代码:

int main(int c, char** args){
    MainEntry();
    return 0;
}

int MainEntry(){
    vector<int> v;
    return 0;
}

所以这是我的两个问题:

  1. MainEntry函数中,有一个push rbp,然后是一个push rbx。为什么 rbx 被压入堆栈?
  2. 如果我理解正确,sub $0x48,%rsp 在堆栈上分配 0x48 字节,并且 lea 0x80(%rsp),%rbp0x80 字节 在堆栈中向下移动并将其指定为基址。 rbp 将在本地堆栈帧中的什么位置结束?它是如何到达那里的?

最佳答案

1) rbx 被压入堆栈,因为调用约定说它在调用之间保留。

2) 这个函数是在没有帧指针的情况下编译的。 rbp 只是在没有帧指针的情况下编译时的另一个通用寄存器。

标题中的问题)该指令不存在。 push 总是需要一个参数。也许你的意思是问为什么不推送 rbp。答案是没有使用它,因此不需要任何说明来保存它。

关于c++ - 为什么函数序言中没有 "mov rsp, rbp"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43083913/

相关文章:

c++ - 如何在 for 循环中记录输入?

c++ - PETSc 和 MPI COMM 世界正确使用

c - C语言中blank是怎么定义的?

assembly - SHL和SAL在80x86中的区别

c++ - 给定代码片段中引用的时间和空间局部性的所有出现

c++ - 我将如何执行此文本模式匹配

c - 优化重复 if else

assembly - 错误 : Operation size not specified - NASm

c++ - vector 的值在不应该发生变化的时候发生了变化

c# - 我可以使用什么作为 C++ 中 Environment.SpecialFolder.CommonApplicationData 的等效项?