【发布时间】:2020-09-22 11:56:13
【问题描述】:
您好,我是汇编语言的新手,当我研究一段代码(使用 gdb 命令:disassemble main 生成)时,我对 lea 指令的语法感到困惑。
lea 0xa8e96(%rip),%rsi # 0x4aa5df
我看到的 lea 语法是
lea src, dest
但似乎在 %rsi 寄存器之后有一个额外的立即值(#0x4aa5df),我应该如何正确解释这个?
编辑:我检查了存储在 %rip 寄存器中的值是
(gdb) p /x $rip
$1 = 0x401730
因此,将其与 0xa8e96 添加给我的 0x4AA5C6 与 0x4aa5df 不匹配,我在这里遗漏了什么吗?
【问题讨论】:
-
这只是您友好的反汇编程序的评论。它会告诉您计算出的地址是什么 (
rip + 0xa8e96 = 0x4aa5df)。它不是指令的一部分。 -
您好,感谢您的回复。我检查了存储在 %rip 寄存器中的值,但不幸的是结果不匹配,我不知道为什么..
-
您想使用
lea指令的地址,以便处理器在该指令执行期间将其作为%rip。您不希望%rip中的任何旧值,因为%rip在每条指令中都会更改 - 只有当您当前停在lea时才有意义,在这种情况下,该值将是 @ 的地址987654330@指令.. -
一般来说,对于 x86,操作数在计算地址方面会变得相当花哨。一般语法是
base(rb, re, n)(如果不需要,可以省略其中一些字段),其中计算的地址是base + rb + n * re,其中base和n是立即值,rb和re`是来自这些寄存器的值。 -
@ErikEidt 实际上
rip已经指向lea,所以应该使用下一条指令的地址。
标签: assembly x86-64 disassembly relative-addressing