不知道为什么我们在汇编代码使用%eax和%edx时添加寄存器%rdx和%rax

时间:2012-10-29 18:33:24

标签: 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(%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

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

3 个答案:

答案 0 :(得分:20)

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

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

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:3)

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

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