为什么在功能序言中没有“mov %rsp, %rbp”
Why is there no `mov %rsp, %rbp` in function prologue?
在汇编中,许多函数以以下序言开头:
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 将在本地堆栈帧中结束在哪里,它是如何到达那里的?
-
rbx
被推送到堆栈上,因为调用约定规定它在调用中保留。 -
此函数在没有帧指针的情况下编译。
rbp
只是在没有帧指针的情况下编译时的另一个通用寄存器。
关于标题中的问题(现已改进(push rsp, rbp
指令不存在。 push
总是接受一个论点。也许你的意思是问为什么rbp
不被推动。答案是没有人使用它,因此不需要任何说明来保存它。
相关文章:
- C++如何仅使用MOV在x86上实现发布和获取
- 如何使用libav编写.mov文件,如果文件未正确完成,则可以播放
- "assembly language" "mov"意味着复制还是移动?
- 为什么这个带有 mov 算术的有效程序集在使用本地变量时无法编译
- 为什么在功能序言中没有“mov %rsp, %rbp”
- 英特尔 Pin:分析例程检测 ah 寄存器而不是 RSP (REG_STACK_PTR)
- 此英特尔至强 mov 指令如何损坏我的应用内存?
- 为什么这 8 个字节写入没有优化为 MOV
- 通过QT播放mov-files
- MOV x86指令是否实现C++11 memory_order_release原子存储
- 如何读取寄存器:RAX、RBX、RCX、RDX、RSP.RBP、RSI、C或C++中的RDI
- C++ASM获取MOV的地址
- Xed2-英特尔64 库 - 发出 MOV 操作码
- 寄存器的 MOV 指令
- AsmJit equivalent of mov eax,[ecx+0CC]
- mov bl在装配中做什么
- 获取arm mov的有效imm编号的快速方法
- 使用原子实现票据锁会产生额外的mov
- 我应该如何解析数据从输入.mov文件和输出解析数据到单独的.txt文件
- 此指令中的错误 C2415 "MOV Incoming_Packet_Length,DWORD PTR SS:[EBP-14]"