【问题标题】:lea assembly instruction syntaxlea 汇编指令语法
【发布时间】: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,其中basen是立即值,rb和re`是来自这些寄存器的值。
  • @ErikEidt 实际上rip 已经指向lea,所以应该使用下一条指令的地址。

标签: assembly x86-64 disassembly relative-addressing


【解决方案1】:

感谢 Jester、Unn 和 Erik 的帮助。 我使用的原始C代码是:

#include <stdio.h>

int main(int argc, char** argv)
{    
    int ret = printf("%s\n", argv[argc-1]);
    argv[0] = '\0'; // NOOP to force gcc to generate a callq instead of jmp
    return ret;
}

而使用gdb生成的汇编代码是:

(gdb) disassemble main
Dump of assembler code for function main:
=> 0x0000000000401730 <+0>:     endbr64
   0x0000000000401734 <+4>:     push   %rbx
   0x0000000000401735 <+5>:     movslq %edi,%rdi
   0x0000000000401738 <+8>:     mov    %rsi,%rbx
   0x000000000040173b <+11>:    xor    %eax,%eax
   0x000000000040173d <+13>:    mov    -0x8(%rsi,%rdi,8),%rdx
   0x0000000000401742 <+18>:    lea    0xa8e96(%rip),%rsi        # 0x4aa5df
   0x0000000000401749 <+25>:    mov    $0x1,%edi
   0x000000000040174e <+30>:    callq  0x44bbe0 <__printf_chk>
   0x0000000000401753 <+35>:    movq   $0x0,(%rbx)
   0x000000000040175a <+42>:    pop    %rbx
   0x000000000040175b <+43>:    retq
End of assembler dump.

所以 rip 确实指向了 lea 指令,并且应该在计算中使用的地址是 0x0000000000401749 ,将其添加到 0xa8e96 会在注释 # 0x4aa5df 中给出地址。

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 2018-07-28
    • 2017-11-30
    • 2014-06-19
    • 1970-01-01
    • 2012-08-14
    • 2015-03-16
    • 2011-01-17
    相关资源
    最近更新 更多