我正在编写一个编译器,它为 Linux (x86-64) 发出以下(Intel 语法)汇编代码:
lea r13, _s1
mov qword ptr [rbp + -2*8], r13
mov r10, qword ptr [rbp + -2*8]
lea r13, qword ptr [r10 + 8]
如果我没看错,这段代码应该将标签
_s1
的地址加载到r13
中,将其存储在堆栈中,从堆栈中将其读取到r10
中,加8,然后存储reuslt在r13
。这符合我程序的预期行为,当我不调试程序时,它似乎按预期工作(程序不会在这里崩溃)。
但是,当我尝试使用 VSCode 和 CodeLLDB 调试程序时,当我逐步执行程序时,我看到了我无法理解的行为。根据 CodeLLDB,这似乎是发生了什么:
lea r13, [0x425290]
:0x425290
被加载到r13
mov qword ptr [rbp - 0x10], r13
:0x425290
写到地址0x7fffffffe1f0
;我通过在 LLDB中运行
memory read -s1 $rbp-0x10
mov r10, qword ptr [rbp - 0x10]
:0xffffe6f400000000
被读成r10
。 为什么?lea r13, [r10 + 0x8]
:0xffffe6f400000008
被加载到r13
为什么我从堆栈读回的值和我写入的值不一样?