views:

508

answers:

5

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.

+3  A: 

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

Lars D
+5  A: 
  • LEA means Load Effective Address
  • MOV means Load Value

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.

Ruben Bartelink
+4  A: 

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
Bartosz Wójcik
thanks a lot, its just that i cannot mark more than one as answer :(
naveen
+1  A: 

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.

Jonathan Swift
I think this answer is confusing at best. "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." Actually LEA will load the address, not the contents of the address. I think actually the questioner needs to be reassured that MOV and LEA can overlap, and do exactly the same thing, in some circumstances
Bill Forster
+2  A: 

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.

Bill Forster