LEA和几个指令如何工作?

时间:2013-08-20 16:01:23

标签: assembly x86

我不完全理解前两行的含义,以及最后两行的差异......

LDS SI,[BX]
LES DI,[BX]
LEA DI,5000h 
MOV DI,5000h

我认为LEA在DI中加载5000h,而MOV在DI中加载5000h的内容。我是对的吗?

2 个答案:

答案 0 :(得分:5)

前两个将bx指向的32位内容加载到dssi(或esdi)。

后两个是相同的,因为值是文字。如果他们是:

lea di,[bx]
mov di,[bx]

然后您的期望是正确的:前者将地址bx放入di,后者将bx指向的16位放入di

有关这两者的更多信息,请参阅les / lds的{​​{3}}和mov / lea的{​​{3}}。

答案 1 :(得分:2)

LEA实际上并没有从内存加载任何东西。它只设置一个最多两个源寄存器(一个可以相乘)和一个目标寄存器的立即值之和。例如,“lea bp,[bx * 2 + si + 3]”将bx的总和设置为bx乘以2加上si加3。

相反,LDS和LES将值从存储器加载到寄存器对:一个段寄存器(DS或ES)和一个通用寄存器。还有其他寄存器的版本:分别用于FS,GS和SS段寄存器的LFS,LGS和LSS(在80386中引入)。

因此这些指令加载“far”指针 - 一个由16位段选择器和16位(或32位,取决于模式)偏移组成的指针,因此总指针大小为32位在16位模式下,48位在32位模式下。

这些是16位模式非常有用的指令,无论是16位实模式还是16位保护模式。

在32位模式下,这些指令不需要,因为所有段寄存器基本上都指向相同的位置,因此不需要加载段寄存器。

在64位模式下,这些指令未实现,其操作码会导致访问冲突。自英特尔实施VEX - “矢量扩展 - (SSE2)”以来,英特尔采用了LDS和LES的操作码并开始将它们用于VEX前缀。因此,256位AVX(YMM)寄存器仅在64位模式下可用