【发布时间】:2020-08-25 10:37:35
【问题描述】:
AT&T 语法,x86-64:
.text
.globl _start
_start:
push %rbp /* push base pointer on stack */
mov %rsp, %rbp /* base pointer points to top of the stack */
sub $12, %rsp /* allocate space for variable */
push $3
push $2
push $1
mov -4(%rbp), %rax
mov %rbp, %rsp
pop %rbp
我正在尝试更多地了解堆栈。我想使用来自rbp 的偏移量从堆栈(1, 2, 3)访问一些变量。我的目标是将值推入rax,然后在调试器中检查寄存器。但是,当我这样做时:
(gdb) x/d $rax
0x0: Cannot access memory at address 0x0
【问题讨论】:
-
这段代码没有多大意义。首先,请注意,64 位模式下的推送指令是 64 位推送。不是 8 倍数的堆栈调整或偏移不是很有意义。你期望得到什么?
-
只要您的调试器运行起来,您可能会发现单步执行程序会提供更多信息,密切关注
ebp和esp寄存器的值以及堆栈的内容。 -
@NateEldredge 我希望得到 3,因为我从基指针中减去 4 个字节,给我第一个局部变量?这是我引用的 en.m.wikibooks.org/wiki/X86_Disassembly/… 我可能读错了。
-
此外,您的“为变量分配空间”注释使您认为值 1、2、3 将被推入您刚刚在堆。但实际上他们被推到了这个之下;推送总是相对于堆栈指针的 current 值。您的代码最终读取了一个 qword,其中 4 个字节来自 rbp 的推送值,在进入程序时可能为 0,而 4 个字节来自恰好位于其下方的堆栈中,您从未初始化并且可能也恰好是 0。
-
您的链接是关于 32 位汇编的,但您正在编写 64 位。所以所有的尺寸和偏移量都是错误的。
标签: assembly x86-64 callstack att