8086中通用寄存器之间的差异

时间:2018-12-20 10:30:30

标签: assembly x86-16

在8086中,此结构是正确的:

mov bh,[bx]

但这是不正确的:

mov bh,[cx]

我不知道为什么。我认为通用寄存器(AX,BX,CX,DX,SP,BP,SI和DI)是可以用于任何目的的寄存器,并且BX用于基地址或CX用于计数器的声明只是一个约定,它们根本没有区别),但看来我错了。你能解释原因吗?这些寄存器之间的确切区别是什么?(例如为什么我不能将基址保存在cx寄存器中)

2 个答案:

答案 0 :(得分:4)

在8086上,只有以下寻址模式可用:

[bx]       [bx + foo]
[foo]      [bp + foo]
[si]       [si + foo]
[di]       [di + foo]
[bx + si]  [bx + si + foo]
[bx + di]  [bx + di + foo]
[bp + si]  [bp + si + foo]
[bp + di]  [bp + di + foo]

其中foo是一些值。请注意,不存在涉及cx的寻址模式,因此[cx]不是有效的内存操作数。

寄存器ax,cx,dx,bx,sp,bp,si和di被称为“通用寄存器”,因为它们可以在所有通用指令中作为操作数进行访问。这与诸如es,cs,ss,ds(段寄存器),ip(指令指针)或标志寄存器等专用寄存器相反,后者只能通过为此目的而专门制作的指令才能访问。

如您所见,并非所有通用寄存器都可用作存储器操作数的索引寄存器。注册代码时必须牢记这一点。

除此限制外,还有一些指令明确地对固定寄存器进行操作。例如,循环指令专门在cx上运行,而32位imul专门在dx:ax上运行。如果您想有效地使用这些说明,请牢记每个通用寄存器的建议用途。

答案 1 :(得分:1)

通用表示这些寄存器可以与“通用指令” (例如movadd)一起用作运算符。

但是所有这些寄存器都至少具有一个特殊功能(列表不完整):

  • ax始终包含mul / div操作之后的结果
  • bx是四个寄存器(bxbpdisi)之一,可用于间接存储器寻址
  • cx被多个指令用作计数器,例如looprep
  • dx包含16位乘法的高阶位
  • sppushpop指令的影响
  • bpleave指令的影响
  • sidi由诸如movsb的字符串指令使用