-4
为什么我们能够使用x86汇编语言中的MOV
指令以这些方式将内存操作数移动到段寄存器?为什么mov ds,[bx]和mov ds,[2345H]有效?
这些为什么有效?
Mov DS,[Bx]
Mov DS,[2345H]
为什么我们能够使用x86汇编语言中的MOV
指令以这些方式将内存操作数移动到段寄存器?为什么mov ds,[bx]和mov ds,[2345H]有效?
这些为什么有效?
Mov DS,[Bx]
Mov DS,[2345H]
因为那些是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根本没有这样的指令。这就是现在所有关于它的知识。它的一个机器代码是
。 MOV是机器命令。 –
他们为什么不呢? 'MOV Sreg,r/m16'列在insn参考手册中。机器码编码仅使用正常的mod/rm字节来允许源为寄存器或内存操作数。请参阅[x86标记wiki](http://stackoverflow.com/tags/x86/info)以获取手册的链接。 –
我投票结束这个问题作为题外话,因为这对未来的读者没有价值。该手册完全回答了整个问题,所以只是RTFM。 –