LEA 汇编指令语法



嗨,我是汇编语言的新手,我对我在研究一段代码时看到的lea指令的语法感到困惑(这是通过使用gdb命令生成的:disassemble main(。

lea    0xa8e96(%rip),%rsi        # 0x4aa5df

我看到的 lea 语法是

lea src, dest 

但是似乎在%rsi寄存器之后还有一个额外的即时值(#0x4aa5df(,我应该如何正确解释它?

编辑:我已经检查了%rip寄存器中存储的值,即

(gdb) p /x $rip 
$1 = 0x401730

因此,将其与0xa8e96一起添加会给我0x4AA5C6与0x4aa5df不匹配,我在这里错过了什么吗?

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

#include <stdio.h>
int main(int argc, char** argv)
{    
int ret = printf("%sn", argv[argc-1]);
argv[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 中给出地址。

最新更新