The reason why the LEA works the way it does is because on the original 8086 the LEA instruction reused the processor's effective address calculation hardware. The effective address hardware calculates the address the memory operand of an instruction acts on. Since there a number of different basic operations that need to be performed to calculate an effective address, this means there was relatively speaking a lot of power packed into a LEA
instruction. Most "real" arithmetic instructions only performed one operation at a time, and most require that destination register be one of the source operands. Since it could be implemented a tiny amount additional encoding space and silicon area, it was pretty cheap considering what its capable of doing.
So an instruction like MOV AX,[BX + SI]
(I'm using Intel syntax here) loads AX
with the 16-bit value stored at the address calculated by adding BX
and SI
. The instruction LEA AX,[BX + SI]
loads AX
with the address calculated by adding BX
and SI
. In other words the LEA instruction treats memory operands differently than other instructions. Instead operating on the memory at the address indicated by the memory operand, it uses the calculated address directly as the operand. The same address encoding is used for both instruction, the LEA instruction just tweaks how the memory operand is interpreted.
In other words, LEA is called that because that's exactly what it does. It loads the effective address given by a memory operand into the destination register. Since the memory operand isn't actually used as memory operand, it does in fact work like an ordinary arithmetic instruction. If ADD is the addition arithmetic instruction, then LEA is the effective address arithmetic instruction.