8086CPU寄存器

8086CPU寄存器

8086CPU共有14个寄存器,分别是AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。所有的寄存器都是16位的。

通用寄存器

AX、BX、CX、DX这4个寄存器通常用来存放一般性数据,称为通用寄存器。这4个寄存器可以分为两个独立的8位寄存器来使用。例如AX可以分为AH和AL。AH为高8位,AL为低8位

段寄存器

8086CPU的地址总线有20位,它通过两个16位的寄存器来寻址。一个寄存器存储段地址,叫做段寄存器,另一个寄存器存储偏移地址。物理地址=段地址x16+偏移地址。由地址加法器将两个16位地址合成为一个20位的物理地址。

段寄存器有4个:CSDSSSES

CS和IP

CS和IP两个寄存器指示了CPU当前要读取指令的地址。CS为代码段寄存器、IP为指令指针寄存器。8086CPU将从CSx16+IP处读取下一条指令。当CPU读取完一条指令后,IP=IP+所读取指令的长度,从而指向下一条指令。

当8086CPU加电启动或复位后,CS被设置为FFFFH,IP被设置为0000H。所以8086CPU启动后执行的第一条指令地址为FFFF0H

CS和IP的值不能使用mov指令修改,而是使用转移指令来修改,例如jmp

DS和[address]

DS寄存器通常用来存放要访问数据的段地址。通过[address]指定数据的偏移地址。例如,访问10000H单元的内容:

1
2
3
mov bx, 1000H
mov ds, bx
mov al, [0]

8086CPU不支持将数据直接送入段寄存器的操作。要将数据送入DS需要先将数据送入一般的寄存器,然后再送入DS寄存器。

SS和SP寄存器

8086CPU提供了栈机制。通过PUSH指令可以将数据从寄存器压入栈中,通过POP指令可以将栈顶的数据弹出到寄存器中。入栈和出栈都是以字为单位的。

栈顶的地址由SSSP表示。SS存储段地址、SP存储偏移地址。SSx16+SP就是当前栈顶元素的物理地址。当执行PUSH指令时,先将SP-2,然后将数据送入CS:IP处。POP命令则相反。

PUSH和POP指令的操作数可以是寄存器段寄存器或内存单元。

未完待续

参考

  1. 《汇编语言(第四版)》王爽

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!