16 位寄存器

当英特尔定义原始 8086 时,它是一个带有 20 位地址总线的 16 位处理器(见下文)。他们定义了 8 个通用 16 位寄存器 - 但它们为某些指令赋予了它们特定的作用:

  • AX 累加器寄存器。
    许多操作码要么假设这个寄存器,要么如果指定则更快。
  • DX 数据寄存器。
    这有时被组合为 32 位值的高 16 位与 AX - 例如,作为乘法的结果。
  • CX 计数寄存器。
    这被用在许多面向循环的指令中作为这些循环的隐式计数器 - 例如 LOOPNE(循环如果不相等)和 REP(重复移动/比较)
  • BX 基本寄存器。
    这可以用于索引内存中结构的基础 - 上述寄存器都不能用于直接索引到内存中。
  • SI 源索引寄存器。
    对于某些移动和比较操作,这是内存的隐式源索引。
  • DI 目的地索引寄存器。
    对于某些移动和比较操作,这是内存的隐式目标索引。
  • SP 堆栈指针寄存器。
    这是集合中最不通用的寄存器! 它指向堆栈中的当前位置,该位置明确用于 PUSHPOP 操作,隐含地用于具有子例程的 CALLRET,并且在中断期间隐式地使用。因此,将其用于其他任何事情都会对你的程序造成危害!
  • BP 基本指针寄存器。
    当子程序调用其他子程序时,堆栈会保存多个堆栈帧BP 可以用来保存当前的堆栈帧,然后当一个新的子程序被调用时,它可以保存在堆栈上,新的堆栈帧被创建和使用,并且从内部子程序返回时,旧的堆栈帧值可以恢复。

笔记:

  1. 前三个寄存器不能用于索引到内存中。

  2. BXSIDI 默认索引到当前数据段(见下文)。

     MOV    AX, [BX+5]     ; Point into Data Segment
     MOV    AX, ES:[DI+5]  ; Override into Extra Segment
    
  3. DI 在用于内存到内存的操作(如 MOVSCMPS)时,仅使用 Extra Segment(见下文)。这不能被覆盖。

  4. SPBP 默认使用 Stack Segment(见下文)。