【问题标题】:Not sure why we add the registers %rdx and %rax when the assembly code has been using %eax and %edx当汇编代码一直使用 %eax 和 %edx 时,不知道为什么要添加寄存器 %rdx 和 %rax
【发布时间】:2012-10-19 02:53:44
【问题描述】:

你好,我需要一些帮助来理解这个汇编代码中发生了什么:

        .file   "mystery.c"

        .text

        .globl mystery

              .type mystery, @function

 mystery:
   pushq    %rbp
    movq    %rsp, %rbp

   movl %edi, -20(%rbp)
   movl $1, -16(%rbp)
   movl $0, -12(%rbp)
   movl $0, -8(%rbp)
   cmpl $2, -20(%rbp)
   jg   .L2
   movl $1, %eax
   jmp  .L3

  .L2:
movl    $2, -4(%rbp)
jmp .L4

  .L5:
movl    -12(%rbp), %eax
movl    -16(%rbp), %edx
leal    (%rdx,%rax), %eax
movl    %eax, -8(%rbp)
movl    -16(%rbp), %eax
movl    %eax, -12(%rbp)
movl    -8(%rbp), %eax
movl    %eax, -16(%rbp)
addl    $1, -4(%rbp)

.L4:
movl    -4(%rbp), %eax
cmpl    -20(%rbp), %eax
jle .L5
movl    -8(%rbp), %eax

.L3:
leave
ret

我完全理解发生了什么,直到我到达 .L5,这里的命令 leal(%rdx, %rax),eax 让我感到困惑。到目前为止,我一直在将值移动到 eax 和 edx,现在我将值添加到 rdx 和 rax 中。 rdx 和 rax 来自哪里,他们持有什么价值观?它们只是写 eax 和 edx 的另一种方式吗?感谢您的帮助。

【问题讨论】:

  • 装配问题应使用架构进行标记。 [x86]?还有什么?

标签: assembly x86


【解决方案1】:

请参阅this 相关答案。它解释了不同的寄存器及其演变。在这种情况下,%rax 寄存器是一个 64 位寄存器。 %eax 是 32 位的,%ax 是 16 位的。 %ah指寄存器16位中的高8位,%al指低端。

这个小图取自同一问题的另一个答案,但它显示得很好......

|63..32|31..16|15-8|7-0|
               |AH.|AL.|
               |AX.....|
       |EAX............|
|RAX...................|

【讨论】:

    【解决方案2】:

    这些只是描述寄存器的其他方式。根据“前缀”,它们是 64、32、16 或 8 位:

    • rax - 64 位
    • eax - 32 位
    • ax - 16 位
    • ah - ax 的高 8 位
    • al - ax 的低 8 位

    【讨论】:

      【解决方案3】:

      因为在 64 位模式下,具有 64 位“地址”和 32 位目标的lea 是最短的编码。

      将其设为 32 位地址不会影响结果,但会花费一个字节。

      【讨论】:

      • 但是为什么不简单的mov eax, edx呢?
      • @LưuVĩnhPhúc 很好地添加了它们,但它可能是 addl %edx, %eax(又名 add eax, edx)。
      • 是的,我知道,但为什么要使用 lea 而不是 mov?会更快/更短
      • @LưuVĩnhPhúc 据我所知,如果可以使用mov,则没有理由使用lea。它并不短,而且lea 在许多 µarch 上的吞吐量略低于mov
      猜你喜欢
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      相关资源
      最近更新 更多