title: Not sure why we add the registers %rdx and %rax when the assembly code has been using %eax and %edx
body: <p>Hello I need some help understanding what is going on in this assembly code:</p>
  
  <pre><code>        .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
  </code></pre>
  
  <p>I understand exactly what is going on UNTIL I get to .L5, Here the command <code>leal(%rdx, %rax)</code>, eax is what is confusing me.  Up until now ive been moving values to eax and edx and now im adding the values in rdx and rax.  Where is rdx and rax coming from and what values are they holding?  Are they just another way of writing eax and edx?  Thanks for any help.</p>