跳到新功能后rbp的值改变

问题描述

我有以下汇编程序:

.globl main
main:
    push %rbp
    mov %rsp,%rbp
    movb $8,-1(%rbp)
    movw $30,-4(%rbp)
    mov -1(%rbp),%rax
    add -4(%rbp),%rax
    call func
    pop %rbp
    ret

func:
    push %rbp
    mov %rsp,%rbp
    movl $7,-4(%rbp)
    mov -4(%rbp),%rbx
    pop %rbp
    ret

单步执行程序时,在尝试访问值call func的{​​{1}}之后但在push %rbp之前,该值先前为$ 0x0800001e`(8字节,0字节,0个字节(30个字节),它现在显示全零:

rbp

为什么会这样? >>> x/1xw $rbp-4 0x7fffffffe410: 0x00000000 是否在函数调用之间重置其值(尽管保留其地址)?

解决方法

Rem的值 不变。每个asm指令仅以手册中记录的方式更改计算机的体系结构状态(寄存器+内存内容)。 (英特尔和AMD都发布了PDF手册; IInel的PDF的指令集参考的HTML摘录位于https://www.felixcloutier.com/x86/

您正在转储RBP指向的内存,而不是打印RBP的值。 (使用p /x $rbp执行此操作。或者使用layout reg使用GDB的TUI模式。有关GDB的提示,请参见https://stackoverflow.com/tags/x86/info的底部。)

call推送寄信人地址时,内存会改变。例如,您没有使用sub $8,%rsp为本地变量保留任何空间,因此RSP = RBP,RSP下方的空间是pushcall的写入位置。

这就是为什么非叶子函数不能将红色区域(位于RSP之下)用于其本地变量。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...