欢迎访问我的个人博客
https://vincillau.github.io/
文章目录
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指令的操作数可以是寄存器
、段寄存器
或内存单元。
未完待续
参考
- 《汇编语言(第四版)》王爽