Не уверен, почему мы добавляем регистры% rdx и% rax, когда код сборки использует% eax и% edx

Здравствуйте, мне нужна помощь, чтобы понять, что происходит в этом коде сборки:

        .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? Спасибо за любую помощь.

Ответы на вопрос(3)

Ваш ответ на вопрос