Hi there,
I would like to know Whats the difference between these instructions.
MOV AX, TABLE-ADDR
and
LEA AX, TABLE-ADDR
P.S: As I am not skilled in this domain, kindly provide a simple solution.
Hi there,
I would like to know Whats the difference between these instructions.
MOV AX, TABLE-ADDR
and
LEA AX, TABLE-ADDR
P.S: As I am not skilled in this domain, kindly provide a simple solution.
If you only specify a literal, there is no difference. LEA has more abilities, though, and you can read about them here:
http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter%5F6/CH06-1.html#HEADING1-136
In short, LEA loads a pointer to the item you're addressing whereas MOV loads the actual value at that address.
The purpose of LEA is to allow one to perform a non-trivial address calculation and store the result [for later usage]
LEA ax, [BP+SI+5] ; Compute address of value
MOV ax, [BP+SI+5] ; Load value at that address
Where there are just constants involved, MOV (through the assembler's constant calculations) can sometimes appear to overlap with the simplest cases of usage of LEA. Where its useful is if you have a multi-part calculation with multiple base addresses etc.
it depends on the used assembler
coz
mov ax,table_addr
in MASM works as
mov ax,word ptr[table_addr]
so it loads the first bytes from table_addr and NOT the offset to table_addr
you should use instead
mov ax,offset table_addr
or
lea ax,table_addr
which works the same.
lea version also works fine if table_addr is a local variable eg.
some_procedure proc
local table_addr[64]:word
lea ax,table_addr
The difference is subtle but important. The MOV instruction is a 'MOVe' effectively a copy of the address that the TABLE-ADDR label stands for. The LEA instruction is a 'Load Effective Address' which is an indirected instruction, which means that TABLE-ADDR points to a memory location at which the address to load is found.
Effectively using LEA is equivalent to using pointers in languages such as C, as such it is a powerful instruction.
The instruction MOV reg,addr means read a variable stored at address addr into register reg. The instruction LEA reg,addr means read the address (not the variable stored at the address) into register reg.
Another form of the MOV instruction is MOV reg,immdata which means read the immediate data (i.e. constant) immdata into register reg. Note that if the addr in LEA reg,addr is just a constant (i.e. a fixed offset) then that LEA instruction is essentially exactly the same as an equivalent MOV reg,immdata instruction that loads the same constant as immediate data.