2016-04-15 551 views
-4

为什么我们能够使用x86汇编语言中的MOV指令以这些方式将内存操作数移动到段寄存器?为什么mov ds,[bx]和mov ds,[2345H]有效?

这些为什么有效?

Mov DS,[Bx] 

Mov DS,[2345H] 
+0

。 MOV是机器命令。 –

+0

他们为什么不呢? 'MOV Sreg,r/m16'列在insn参考手册中。机器码编码仅使用正常的mod/rm字节来允许源为寄存器或内存操作数。请参阅[x86标记wiki](http://stackoverflow.com/tags/x86/info)以获取手册的链接。 –

+4

我投票结束这个问题作为题外话,因为这对未来的读者没有价值。该手册完全回答了整个问题,所以只是RTFM。 –

回答

2

因为那些是MOV指令的有效形式。 MOV指令允许下列移动(我省略移动从控制和调试寄存器/;详情见你的CPU手册):

general-purpose register <- integer constant 
memory <- integer constant 

general-purpose register <- general-purpose register 
memory <- general-purpose register 
general-purpose register <- memory 

segment register <- general-purpose register 
segment register <- memory 
general-purpose register <- segment register 
memory <- segment register 

的CPU不支持MOV指令以下动作:

segment register <- segment register 
segment register <- integer constant 
memory <- memory 

如果你想知道为什么,它简化了CPU中的东西。 CPU需要解码的指令越少,同样可能的操作数编码也越少。当一条指令最多可以访问一个内存位置时,可能要处理的特殊情况也会减少。大多数说明都是这样的。这使得设计更简单,CPU更便宜。有几条指令可以访问两个内存位置,但是它们非常专业化,它们的内存位置不是非常灵活(它们绑定到特定的寄存器)。 PUSH和POP可以在内存和堆栈之间移动数据(堆栈是内存)。 MOVSB/MOVSW/MOVSD将DS:(E | R)SI存储器中的数据移动到ES:(E | R)DI的存储器中。

你的汇编器不会让你MOV WORD [BX], [SI],因为它知道CPU不能这样做,CPU根本没有这样的指令。这就是现在所有关于它的知识。它的一个机器代码是