如何解决跳到新功能后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下方的空间是push
和call
的写入位置。
这就是为什么非叶子函数不能将红色区域(位于RSP之下)用于其本地变量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。