为什么我不能在堆栈上正确存储数据?

问题描述 投票:0回答:0

我正在编写一个编译器,它为 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

为什么我从堆栈读回的值和我写入的值不一样?

assembly x86-64 gnu-assembler intel-syntax
© www.soinside.com 2019 - 2024. All rights reserved.