为什么我们能够使用x86汇编语言中的MOV
指令以这些方式将内存操作数移动到段寄存器?
为什么这些有效?
Mov DS,[Bx]
Mov DS,[2345H]
答案 0 :(得分: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根本就没有这样的指令。这就是你现在要了解的全部内容。