Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 8086中通用寄存器之间的差异_Assembly_X86 16_Cpu Registers_Addressing Mode - Fatal编程技术网

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

Assembly 8086中通用寄存器之间的差异,assembly,x86-16,cpu-registers,addressing-mode,Assembly,X86 16,Cpu Registers,Addressing Mode,在8086中,此结构是正确的: mov bh,[bx] 但这是不正确的: mov bh,[cx] 我不知道为什么。我认为通用寄存器(AX、BX、CX、DX、SP、BP、SI和DI)是我们可以用于任何目的的寄存器,BX表示基址或CX表示计数器的语句只是一种约定,它们根本没有区别。但似乎我错了。你能解释一下原因吗?这些寄存器之间的确切区别是什么?(例如,为什么我不能在cx寄存器中保存基址?在8086上,只有以下寻址模式可用: [bx] [bx + foo] [foo] [b

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

mov bh,[bx]
但这是不正确的:

mov bh,[cx]

我不知道为什么。我认为通用寄存器(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]
其中
foo
是一些值。请注意,不存在涉及
cx
的寻址模式,因此
[cx]
不是有效的内存操作数

寄存器ax、cx、dx、bx、sp、bp、si和di称为通用寄存器,因为它们在所有通用指令中都可以作为操作数访问。这与特殊用途寄存器(如es、cs、ss、ds(段寄存器)、ip(指令指针)或标志寄存器)不同,这些寄存器只能通过专门为此目的制作的特殊指令访问

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


除了这个限制之外,还有一些指令隐式地操作固定寄存器。例如,循环指令只在
cx
上运行,32位imul只在
dx:ax
上运行。如果您想有效地使用这些指令,最好记住每个通用寄存器的建议用途。

通用意味着这些寄存器可以用作带有“通用指令”的操作数,例如
mov
add

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

  • ax
    始终向
    mul
    /
    div
    操作提供输入并接收结果
  • ax
    作为默认累加器寄存器,各种指令的编码较短
  • bx
    是四个寄存器之一(
    bx
    bp
    di
    si
    ),可用于16位寻址模式下的间接内存寻址
  • cx
    被多条指令用作计数器,例如移位计数、
    循环
    rep
  • dx
    包含16位到32位乘法中结果的高阶位,以及32位到16位分段中输入的高阶位
  • sp
    push
    pop
    指令以及各种
    call
    ret
    类型控制传输指令的影响和使用。也可由硬件中断异步使用
  • bp
    enter
    leave
    指令的影响。(但不要使用
    enter
    ,速度很慢)
  • si
    di
    由字符串指令使用,如
    movsb

@zx485不。该答案无法解释实际问题,即8086上可能的寻址模式集。请注意,如果将bp用作基址寄存器,则默认段寄存器为ss而不是ds。
ax
作为默认累加器寄存器,如下所述: