欢迎访问我的个人博客
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个:CS 、DS 、SS 、ES 。
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单元的内容:
mov bx, 1000H
mov ds, bx
mov al, [0]
8086CPU不支持将数据直接送入段寄存器的操作。要将数据送入DS需要先将数据送入一般的寄存器,然后再送入DS寄存器。
SS和SP寄存器
8086CPU提供了栈机制。通过PUSH 指令可以将数据从寄存器压入栈中,通过POP 指令可以将栈顶的数据弹出到寄存器中。入栈和出栈都是以字为单位的。
栈顶的地址由SS 和SP 表示。SS存储段地址、SP存储偏移地址。SSx16+SP就是当前栈顶元素的物理地址。当执行PUSH指令时,先将SP-2,然后将数据送入CS:IP处。POP命令则相反。
PUSH和POP指令的操作数可以是寄存器 、段寄存器 或内存单元。
未完待续
参考
- 《汇编语言(第四版)》王爽
|