lea汇编指令语法

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

嗨,我是汇编语言的新手,当我学习一段代码(使用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不匹配,我在这里缺少什么吗?

assembly x86-64 disassembly relative-addressing
1个回答
2
投票

感谢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中给出地址。

© www.soinside.com 2019 - 2024. All rights reserved.