为什么mov ds,[bx]和mov ds,[2345H]有效?

时间:2016-04-15 07:43:27

标签: assembly x86 intel masm

为什么我们能够使用x86汇编语言中的MOV指令以这些方式将内存操作数移动到段寄存器?

为什么这些有效?

Mov DS,[Bx]

Mov DS,[2345H]

1 个答案:

答案 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根本就没有这样的指令。这就是你现在要了解的全部内容。