MOV和LEA有何区别?

我想知道这些说明之间的区别是什么:

MOV AX, [TABLE-ADDR] 

 LEA AX, [TABLE-ADDR] 
  • LEA表示加载有效地址
  • MOV表示加载值

简而言之,LEA加载一个指向你正在处理的项目的指针,而MOV加载该地址的实际值。

LEA的目的是允许用户执行一个不重要的地址计算并存储结果[供以后使用]

 LEA ax, [BP+SI+5] ; Compute address of value MOV ax, [BP+SI+5] ; Load value at that address 

在涉及常量的地方,MOV(通过汇编程序的常量计算)有时可能会与使用LEA的最简单情况重叠。 如果你有一个包含多个基地址的多部分计算,那么它是有用的。

在NASM语法中:

mov eax, var == lea eax, [var] 。 (即mov r32, imm32

lea eax, [var+16] == mov eax, var+16

lea eax, [eax*4] == shl eax, 2 (但没有设置标志)


在MASM语法中,使用OFFSET var来获得一个mov-immediate而不是一个负载。

指令MOV reg,addr表示将存储在地址addr中的variables读入寄存器reg。 指令LEA reg,addr表示将地址(不是存储在地址中的variables)读入寄存器reg。

MOV指令的另一种forms是MOV reg,immdata,即将立即数据(即常量)immdata读入寄存器reg。 请注意,如果LEA reg中的addr,addr只是一个常数(即一个固定的偏移量),那么LEA指令本质上与加载与立即数据相同常量的等效MOV reg,immdata指令完全相同。

如果你只指定一个文字,没有区别。 然而,LEA有更多的能力,你可以在这里阅读:

http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_6/CH06-1.html#HEADING1-136

这取决于使用的汇编程序,因为

 mov ax,table_addr 

在MASM工作

 mov ax,word ptr[table_addr] 

所以它从table_addr加载第一个字节,而不是到table_addr的偏移量。 你应该使用

 mov ax,offset table_addr 

要么

 lea ax,table_addr 

其工作原理是一样的。

如果table_addr是一个局部variableseg lea版本也工作正常

 some_procedure proc local table_addr[64]:word lea ax,table_addr 

差别是微妙但重要的。 MOV指令是“MOVe”,实际上是TABLE-ADDR标签所代表的地址的副本。 LEA指令是一个“加载有效地址”(Load Effective Address),它是一个间接指令,这意味着TABLE-ADDR指向一个内存地址,在这个地址上加载地址。

有效地使用LEA相当于在C语言中使用指针,因此它是一个强大的指令。

基本上…“进入REG …计算后…”这似乎是很好的其他目的,以及:)

如果你忘记了这个值是一个指针,你可以使用它来进行代码优化/最小化…

 MOV EBX , 1 MOV ECX , 2 ;//with 1 instruction you got result of 2 registers in 3rd one ... LEA EAX , [EBX+ECX+5] 

EAX = 8

原来这将是:

 MOV EAX, EBX ADD EAX, ECX ADD EAX, 5