Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

lea assembly instruction

I Just want to make sure I am reading this right:

movl 12(%ebp), %edx
leal (%edx, %edx, 4), %eax

I read the first line as: edx = [epb + 12], and the second line as: eax = edx + edx*4

Can anybody clarify?

Also, what if I had the following two lines:

leal (%edx, %edx, 4), %eax
leal (%edx, %edx, 2), %eax

Once the second line is executed, would the eax register be overwritten?

And the eax = edx + edx*4 is multiplying the address by 4? Or the contents of the address by 4?

like image 553
Chris Dargis Avatar asked Feb 05 '12 21:02

Chris Dargis


2 Answers

The instruction movl 12(%ebp), %edx means: edx = [ebp + 12]. This is a memory reference (a read operation) to the address ebp + 12 whose contents (a double word) are read to edx register.

The instruction leal (%edx, %edx, 4), %eax means: eax = edx * 5 (which is a simplification of eax = edx + edx * 4). The leal instruction doesn't do memory references. It only performs arithmetic with registers.

As an answer to your second question: Yes, eax would be overwritten because the instruction leal (%edx, %edx, 2), %eax means eax = edx * 3 which is different from the first instruction, eax = edx * 5.

like image 138
Smi Avatar answered Oct 07 '22 09:10

Smi


You're right. The LEA instruction is used to Load (the) Effective Address, and can be used for address arithmetic and sometimes also ordinary arithmetic, if you don't need the flags.

like image 22
Daniel Kamil Kozar Avatar answered Oct 07 '22 09:10

Daniel Kamil Kozar