寄存器是CPU中程序员可以用指令读写的部分,程序员通过改变各种寄存器中的内容来实现对CPU的控制
8086CPU有14个寄存器,每个寄存器有一个名称,这些寄存器是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW
通用寄存器
AX、BX、CX、DX 这4个寄存器可以用来存放一般性数据,被称为通用寄存器
这4个寄存器都是16位的,可以存放两个字节,同时每个寄存器可以分为两个8位寄存器,如AX能够被分为AH(AX的高8位)与AL(AX的低8位)
类似的还有BP、SP、SI、 DI四个寄存器,但这4个寄存器只能以16位模式访问
这些寄存器还能分为以下几类:
- AX称为累加器(Accumulator),是CPU中使用最多,功能最强,执行效率的寄存器
- BX、SI、DI与BP被称为基地址寄存器(Base Register),只能用基地址寄存器来作为地址访问内存(例如[bx]),基地址寄存器可以组合出现,如用[bx + di]来访问内存,但要注意只有四种组合: bx&si, bx&di, bp&si, bp&di。
- CX称为计数寄存器(Count Register),与loop指令配合使用,每loop一次cx减一,当cx == 0时退出loop循环
- DX称为数据寄存器(Data Register)
段寄存器
8086在访问内存时要通过段地址与偏移地址访问(通过地址加法器最后的地址为:段地址*16 + 偏移地址),段地址储存在段寄存器中。8086有4个段寄存器,分别为:CS、DS、SS、ES。
CS代码段寄存器
CS为代码段寄存器,它与IP(指令指针寄存器)共同指示了CPU当前要读取指令的地址,任意时刻,CPU将CS:IP指向的内容当作指令执行
不能用mov指令修改CS:IP的值,需要用“jmp 段地址:偏移地址”指令来实现修改
也可以使用“jmp 合法寄存器” 来实现用寄存器中的值修改IP
DS数据段寄存器
DS寄存器用来存放要访问的数据的段地址,结合[Address]来实现对内存的访问
例如要将1000H:0的数据(一个字节)读入AX
mov bx, 1000H ;将1000H的段地址写入bx mov ds, bx ;将bx的地址写入ds mov al, [0] ;从ds:0的位置读写数据写入al
注意8086并不支持直接将数据写入段寄存器,需要用寄存器中转
若要读写一个字(16位),则有 mov ax, [0] 等效于 mov al, [0] 与 mov ah, [1] 两句(当然在8086中可以一次性完成16位的数据传送)
SS栈段寄存器
SS寄存器与SP寄存器共同(组成 SS:SP)指向栈顶元素,可以用pop与push进行栈操作
push 指令由两步完成:
- SP -= 2,将SS:SP指向新的栈顶
- 将寄存器中的数据送入SS:SP指向的内存单元
pop 指令同样由两步组成:
- 将SS:SP指向的内存单元的数据送入寄存器
- SP += 2
注意在8086中没有对栈超界的检查,应该注意防止出界。由于push与pop指令只会修改SP,所以栈不会超出SS指向的段(64K)
可以用mov来修改SS:SP的值来设置栈顶位置