栈帧push的汇编解释
下面是常见的反汇编代码
push %rbp
mov %rsp,%rbp
push %rbx
sub $0x18,%rsp
pop %rbx
pop %rbp
retq
push %rbp
是把%rbp
寄存器的值保存到内存里面的数组模拟栈,结合下面的mov %rsp,%rbp
可以知道,%rbp
此刻push的就是上面一个栈帧的栈低位置,同时mov也将本初始化为0长度的栈帧低保存起来,因为此刻rsp是上一个栈帧的栈顶位置,刚好就是我的栈底位置。所以mov是把左边的操作数的值赋给右边。
下一步sub $0x18,%rsp
表示将rsp减去24个字节,代表给传参留位置。这样rsp就开始移动。所以sub也是右边是结果,右边减去最左边。
push %rbx是因为是被调用者保护rbx
最后从栈弹出保存的rbx rbp到对应的寄存器,这样就相当于恢复的执行上下文。retq就返回到返回地址,一般是下一条指令地址。