在8086中,此结构是正确的:
mov bh,[bx]
Run Code Online (Sandbox Code Playgroud)
但这是不正确的:
mov bh,[cx]
Run Code Online (Sandbox Code Playgroud)
我不知道为什么 我认为通用寄存器(AX,BX,CX,DX,SP,BP,SI和DI)是可以用于任何目的的寄存器,并且BX用于基地址或CX用于计数器的声明只是一个约定,它们完全没有区别。但是看来我错了。你能解释原因吗?这些寄存器之间的确切区别是什么?(例如,为什么不能将基址保存在cx寄存器中?)
在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]
Run Code Online (Sandbox Code Playgroud)
这里foo是一些价值。请注意,不cx存在涉及的寻址模式,因此[cx]不是有效的内存操作数。
寄存器ax,cx,dx,bx,sp,bp,si和di称为通用寄存器,因为它们可以作为所有通用指令中的操作数进行访问。这与专用寄存器(例如es,cs,ss,ds(段寄存器),ip(指令指针)或标志寄存器)相反,后者只能通过为此目的而专门制作的指令才能访问。
如您所见,并非所有通用寄存器都可用作存储器操作数的索引寄存器。注册代码时必须牢记这一点。
除此限制外,还有一些指令对固定寄存器进行隐式操作。例如,循环指令仅对进行操作,cx而32位imul仅对进行操作dx:ax。如果要有效使用这些说明,请牢记每个通用寄存器的建议用途。