任何人都可以帮助我理解以下说明 -
LES SI,DATA1
MOV DI,OFFSET DATA2
MOV BX,[SI]
MOV CX,[DI]
MOV[SI],CX
答案 0 :(得分:2)
LES
不是LEA
。 LES x, y
将y
解释为远指针并将其数据加载到ES
(段寄存器)和x
。
给出的指令序列很奇怪,因为ES
实际上并未使用。
无论如何,指令序列(如果[SI]
更改为ES:[SI]
)是:给定远指针(DATA1
)和变量(DATA2
),移动DATA1
指向BX
的内容,并将其替换为DATA2
当前存储的内容(也将位于CX
中)。
答案 1 :(得分:1)
您可以只查找汇编指令页面,它将以简单易懂的方式解释每个指令的作用;在许多方面,基本的,低级简单的汇编比单纯的语言更容易理解单行。
我永远不会记得哪个x86汇编语法在一段时间内没有使用它的方式命令事物(两个主要的x86汇编语法以相反的顺序对操作数进行排序),所以我不会说出确切的结果这里。
对于第一个,我认为这是一个错字,你的意思是LEA而不是LES?如果我没记错的话,LEA代表“加载有效地址”。它的主要目的是当你想要实际知道地址而不是仅使用地址时计算某事物的内存地址。
(编辑) 我之前没有使用过LES,谷歌想把我重定向到LEA,因此我的上述声明。我会留下上述内容,所以你也可以从中受益。 (/编辑)
MOV将数据从一个地方移动到另一个地方。 MOV指令中被[]方括号括起来的操作数意味着您需要该存储器地址,因此MOV CX,[DI]将“将CX寄存器的内容移动到DI中保存的地址的存储单元中注册“(或者相反,[DI]进入CX,参见上面关于操作数顺序的陈述)。
我不确定“OFFSET DATA2”,因为我不记得偏移关键字。
答案 2 :(得分:0)
对应于以下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.