Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Not sure why we add the registers %rdx and %rax when the assembly code has been using %eax and %edx

Tags:

x86

assembly

Hello I need some help understanding what is going on in this assembly 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

I understand exactly what is going on UNTIL I get to .L5, Here the command leal(%rdx, %rax), 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.

like image 424
Rizwan Chaudry Avatar asked Oct 29 '12 18:10

Rizwan Chaudry


People also ask

What is the RAX register used for?

The RAX register is used for return values in functions regardless of whether you're working with Objective-C or Swift.

Are Rax and EAX the same register?

rax is the 64-bit, "long" size register. It was added in 2003 during the transition to 64-bit processors. eax is the 32-bit, "int" size register. It was added in 1985 during the transition to 32-bit processors with the 80386 CPU.

What are the registers in assembly language?

To speed up the processor operations, the processor includes some internal memory storage locations, called registers. The registers store data elements for processing without having to access the memory. A limited number of registers are built into the processor chip.

What are EAX EBX ECX EDX registers?

The EAX, EBX, ECX, EDX, EBP, EDI, and ESI registers are all 32-bit general-purpose registers, used for temporary data storage and memory access. Some of CPU instructions modify specific registers.


2 Answers

See this related answer. It explains the different registers and their evolution. In this case, the %rax register is a 64 bit register. %eax is the 32 bit one, and %ax would be 16 bits. %ah refers to the high 8 bits of the 16 bits in the register, and %al refers to the lower end.

This little diagram was taken from another answer to the same question, but it shows it well...

|63..32|31..16|15-8|7-0|
               |AH.|AL.|
               |AX.....|
       |EAX............|
|RAX...................|
like image 87
CoffeeRain Avatar answered Oct 22 '22 05:10

CoffeeRain


Those are "really just" other ways to describe a register. Depending on the "prefix", they're either 64, 32, 16 or 8 bits:

  • rax - 64 bits
  • eax - 32 bits
  • ax - 16 bits
  • ah - upper 8 bits of ax
  • al - lower 8 bits of ax
like image 30
Linus Kleen Avatar answered Oct 22 '22 03:10

Linus Kleen