我不完全理解前两行的含义,以及最后两行的差异......
LDS SI,[BX]
LES DI,[BX]
LEA DI,5000h
MOV DI,5000h
我认为LEA在DI中加载5000h,而MOV在DI中加载5000h的内容。我是对的吗?
答案 0 :(得分:5)
前两个将bx
指向的32位内容加载到ds
和si
(或es
和di
)。
后两个是相同的,因为值是文字。如果他们是:
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位模式下可用