assembly 为什么函数序言中没有“mov rsp,rbp”?

zzlelutf  于 2023-02-12  发布在  其他
关注(0)|答案(1)|浏览(152)

在汇编语言中,许多函数都是从下面的序言开始的:

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被压入堆栈?
1.如果我没理解错的话,sub $0x48,%rsp在栈上分配0x48 byteslea 0x80(%rsp),%rbp在栈上向下移动0x80 bytes,并将其赋值为基址。rbp将在本地栈帧中的何处结束?它是如何到达那里的?

sshcrbum

sshcrbum1#

1)rbx被压入堆栈,因为调用约定说它在调用之间被保留。
2)此函数在编译时不使用帧指针。在编译时不使用帧指针,rbp只是另一个通用寄存器。
标题中的问题)那个指令不存在。push总是带一个参数。也许你想问为什么rbp没有被压入。答案是什么都没有用过,所以不需要任何指令来保存它。

相关问题