Assembly 不确定为什么在汇编代码使用%eax和%edx时添加寄存器%rdx和%rax

Assembly 不确定为什么在汇编代码使用%eax和%edx时添加寄存器%rdx和%rax,assembly,x86,Assembly,X86,您好,我需要一些帮助来了解此汇编代码中发生了什么: .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(%rb

您好,我需要一些帮助来了解此汇编代码中发生了什么:

        .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的另一种方式吗?感谢您的帮助。

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

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

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

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

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

      这个小图表取自同一个问题的另一个答案,但它很好地展示了它

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

      装配问题应该用architeture标记。[x86]?还有别的吗?但为什么不是一个简单的
      mov-eax,edx
      ?@LưuVĩnhPhúc它加上了它们,它可能是一个
      addl%edx,%eax
      (又称
      add-eax,edx
      )。是的,我知道,但为什么要用lea而不是mov呢?会更快吗/shorter@L据我所知,如果可以使用
      mov
      ,就没有理由使用
      lea
      。它并不更短,而且在许多µARCH上,
      lea
      的吞吐量略低于
      mov