What is the purpose of the lea instruction?
LEA is often used as a trick to do certain computations, but that's not its primary purpose.The x86 instruction set was designed to support high-level languages where the use of ints or small structs is common.Consider a struct representing coordinates.
There is an array of points.This statement can be compiled if the base of the array is already in EBX and the variable xcoord is in the struct.
It will land in EDX.The scale factor of 8 is due to the size of each point.The same expression is used with the "address of" operator.
You don't want the value of ycoord, but its address.Load effective address comes in.The compiler can generate instead of a MOV.
The only instruction that addresses memory is LEA.LEA does nothing more than store the calculated memory offset in the specified register, which may be a general purpose register.
The difference between the two is that the former does not change EFLAGS but the latter does.
One important feature of the LEA instruction is that it does not alter the condition codes such as CF and ZF, while computing the address by the ADD or MUL instructions.The feature decreases the level of dependency among instructions and makes room for further improvement by the hardware scheduler.
Its name is stupid for a shift+add operation.The reason for that was already explained in the top rated answers.It was designed to map high level memory references.
Maybe it's another thing about LEA instruction.LEA can be used for fast multiplication of registers by 3, 5 or 9.
Load effective address is an abbreviation of lea.The address of the location reference is loaded into the destination.You could use it to something.
To move ebx pointer eax items further with a single instruction.The x86 architecture supports complex addressing modes to manipulate pointers efficiently.
If you need to perform calculations on the register that you are using to calculate the address, LEA is the way to go.It is possible to perform what amounts to pointer arithmetic on several of the registers for free.
You aren't actually deferring the memory when you write an LEA like a MOV.In other words.
What is found in that location will not be moved into the address EBX * 8.You can see that it is possible to multiply by factors of two, but only if the MOV is limited to adding/subtracting.
The 8086 has a large family of instructions that accept a register operand and an effective address, perform some computations to compute the offset part of that effectiveaddress, and perform an operation involving the register and the memory referred to by the computed address.It was easy to have one of the instructions in that family behave in a certain way.Thus, the instructions.
Almost identically, they were implemented inside.A skipped step is the difference.Both instructions are similar.
I'm not sure why Intel thought this instruction was worth including, but the fact that it was cheap would have been a big factor.The assembler of Intel allowed symbols to be defined relative to the register.If fnord was defined as a relative symbol.One could say:
If you forget the world "offset", the contents of location will be added to DI.Oops.
LEA has advantages of performing memory addressing arithmetic without accessing memory, saving the result to a different register, instead of the simple form of add instruction.The real underlying performance benefit is that modern processor has a separate LEA ALU unit and port for effective address generation, this means the arithmetic operation in lea could be done in parallel in one core.
There is an article about Haswell architecture at Realworldtech.com.
Another important point that is not mentioned in other answers is the fact that the PC relative address of the instruction is PIC, which is a position independent code.This is different from a feature called MemoryAddress which requires relocating and patching in modern operating systems.LEA can be used to convert such non PIC to PIC.
The LEA instruction can be used to get the address which comes from any of the Intel processor's memory addressing modes.
The address of the memory location is calculated the same way if we replace the MOV with LEA.We get the location into the destination instead of the memory location.
LEA is a way of intercepting the effective address from any one of the processor's memory addressing modes.
There is no addition of a scaled value.Zero is moved to a different location.We could use an immediate operand as well.
The brackets are part of the addressing mode, which is why people think they are superfluous.
At the hardware level, LEA is real.The generated instruction is used by the processor to calculate the address.Instead of generating a memory reference, it moves the address to the destination.The address calculation of an addressing mode in any other instruction has no effect on the flags.
There is no reason for LEA to exclude this possibility just because there is a shorter alternative.
The LEA instruction can be used to save time.It is better to store an address in a register if it is frequently used.
I'd like to add one more example code for showing how the lea and move instruction work differently when they have the same expression format.
The lea instruction and mov instructions can be used with the parentheses to make a long story short.The expression in the () is calculated the same way, but two instructions will interpret it differently.
When it is used with the mov instruction, it tries to access the value that was generated by the above expression and store it to the destination.
When the lea instruction is executed with the above expression, it loads the generated value as it is to the destination.
The same parameters are used to execute the lea instruction and mov instruction.I added a user-level signal handler to catch the fault caused by accessing a wrong address as a result of mov instruction.
gcc will find the lea instruction for the indicated code line with the -O option.
Adding multiplication, exclusive or setting the status flags like zero are all normal "calculating" instructions.The flags are set according to the xor operation if you use a complicated address.
You might want to use the address multiple times.It is not intended to set status flags when loading such addres into a register.The phrase "load effective address" makes the programmers aware of that.That is where the weird expression comes from.
Once the processor is able to use the complicated address to process its content, it is capable of calculating it for other purposes.It can be used to perform a transformation in one instruction.It is a general rule in assembly programming to use the instructions.Whether the particular transformation embodied by the instruction is useful for you is the only thing that counts.
In the days of x86, you may not get the same results from these two instructions.