LEA和几条指令如何工作?
这个问题在这里已经有了答案:
前两个将由bx
指向的32位内容加载到ds
和si
(或es
和di
)中。
第二个是相同的,因为这些值是文字。 但是,如果他们是:
lea di,[bx]
mov di,[bx]
那么你的期望是正确的:前者将地址bx
放入di
,后者将bx
指向的16位放入di
。
有关两者的更多信息,请参阅les
/ lds
此问题以及mov
/ lea
此问题。
LEA实际上并没有从内存中加载任何东西。 它只设置一个最多两个源寄存器(一个可以相乘)和一个立即值到目的寄存器的总和。 例如,“lea bp,[bx * 2 + si + 3]”设置为bp记录bx与2加上si加3的和。
相反,LDS和LES将内存中的值加载到一对寄存器:一个段寄存器(DS或ES)和一个通用寄存器。 还有其他寄存器的版本:分别用于FS,GS和SS段寄存器的LFS,LGS和LSS(在80386中引入)。
因此,这些指令加载了“远”指针 - 一个由16位段选择器和一个16位(或32位,取决于模式)偏移量组成的指针,所以总的远指针大小为32位, bit模式和48位32位模式。
这些对于16位模式非常有用,无论是16位实模式还是16位保护模式。
在32位模式下,由于所有段寄存器都指向相同的位置,因此不需要这些指令,因此不需要加载段寄存器。
在64位模式下,这些指令没有实现,它们的操作码违反了访问。 自英特尔实施VEX--“矢量扩展 - (SSE2)以来,英特尔将它们的LDS和LES操作码开始用于VEX前缀,结果,256位AVX(YMM)寄存器仅在64位模式下可用。
链接地址: http://www.djcxy.com/p/72365.html