在汇编中,许多函数以下面的序言开始:
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;
}
所以这是我的两个问题:
- 在
MainEntry
函数中,有一个push rbp
,然后是一个push rbx
。为什么rbx
被压入堆栈? - 如果我理解正确,
sub $0x48,%rsp
在堆栈上分配0x48 字节
,并且lea 0x80(%rsp),%rbp
将0x80 字节
在堆栈中向下移动并将其指定为基址。rbp
将在本地堆栈帧中的什么位置结束?它是如何到达那里的?
最佳答案
1) rbx
被压入堆栈,因为调用约定说它在调用之间保留。
2) 这个函数是在没有帧指针的情况下编译的。 rbp
只是在没有帧指针的情况下编译时的另一个通用寄存器。
标题中的问题)该指令不存在。 push 总是需要一个参数。也许你的意思是问为什么不推送 rbp
。答案是没有使用它,因此不需要任何说明来保存它。
关于c++ - 为什么函数序言中没有 "mov rsp, rbp"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43083913/