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