谁能帮我理解以下说明-
LES SI,DATA1
MOV DI,OFFSET DATA2
MOV BX,[SI]
MOV CX,[DI]
MOV[SI],CX
LES
不是LEA
。LES x, y
解释y
为远指针并将其数据加载到ES
(段寄存器)和x
.
但是,给出的指令序列很奇怪,因为ES
实际上并未使用。
无论如何,指令序列(如果将[SI]
更改为ES:[SI]
)是:给定一个远指针(DATA1
)和一个变量(DATA2
),将 指向的内容移动DATA1
到BX
并用当前存储的内容替换它们DATA2
(也将在 中CX
)。
您只需查找汇编指令页面,它就会以简单易懂的方式解释这些指令中的每一个;在许多方面,汇编在其基本的低级简单性中比在高级语言中更容易理解一行。
如果我有一段时间没有使用它(两种主要的 x86 汇编语法以相反的顺序对操作数进行排序),我永远记不起哪种 x86 汇编语法对事物进行排序,所以我不会在这里说出确切的结果。
对于第一个,我认为这是一个错字,您的意思是 LEA 而不是 LES?如果我没记错的话,LEA 代表“加载有效地址”。它的主要目的是在您想实际知道地址而不是仅仅使用地址时计算某物的内存地址。
(编辑)我以前没有使用过 LES,谷歌想把我重定向到 LEA,因此我上面的声明。不过,我将保留上述内容,以便您也可以从中受益。(/编辑)
MOV 将数据从一处移动到另一处。被 [] 方括号括起来的 MOV 指令中的操作数意味着您想要那个内存地址,因此 MOV CX,[DI] 将是“将 CX 寄存器的内容移动到 DI 中保存的地址处的内存位置register”(或者相反,[DI] 到 CX,参见上面关于操作数顺序的语句)。
我不确定“OFFSET DATA2”,因为我不记得偏移关键字。
对应于以下 C 代码:
// DATA1 and DATA2 are 'far' pointers to word of 16 bits, let's say they are 'short'
short bx = *DATA1;
*DATA1 = *DATA2;
// the old value of *DATA1 is still available in the BX register.
// and the value of *DATA2 is still available in the CX register.
// also, ES is set to the segment where DATA1 and DATA2 resides.