寄存器可以分为:通用寄存器、指令指针IP、段寄存器等等。其主要功能是在计算时存储数据、代码。寄存器是在CPU内部,靠内部总线相连。前一篇文章中CPU和内存相连的地址线、数据线、控制线相对寄存器来说是在CPU的外部,靠外部总线相连。
一、通用寄存器
8086CPU的所有寄存器都是16位的,可以放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性数据,被称为通用寄存器。每个寄存器的大小都是16位,由于以前的寄存器是8位的,为了兼容,将寄存器拆分为两个可以独立使用的8位寄存器使用。AX可分为AH(高八位)和AL(低八位),同样BS分为BH和BL。
在介绍其他寄存器之前先看几条汇编指令: ax原值:0000H bx原值:0000H
mov ax,4E20H 将4E20H送入寄存器ax中。 AX:4E20H BX:0000H
add ax,1406H 将1406H和AX的值相加放到ax中。 AX:6226H BX:0000H
mov bx,2000H 将2000H送入bx中。 AX:6226H BX:2000H
add ax,bx 将bx的值和ax的值相加,结果放到ax中 AX:8226H BX:2000H
mov bx,ax 将寄存器ax中的数据送入寄存器b。 AX:8226H BX:8226H
add ax,bx 将bx的值和ax的值相加,结果放到ax中 AX:044CH BX:8226H
在最后一步,ax和bx的值都为8226H,相加结果为1044CH,但ax为16位寄存器,最大值为FFFFH,已经超出范围。所以最高位的1不能保存在ax中,导致ax的数据位044CH。
二、8086CPU给出物理地址的方法。
8086CPU有20位地址总线,一次可以传送20位地址,达到1MB寻址能力。但是8086CPU的寄存器只有16位,在内部一次性处理、传输的地址为16位。如果加大内部的传输能力就会导致CPU外部地址线的浪费。
因此8086采用内部两个16位地址合成的方法形成一个20位的物理地址。如第一个图。物理地址=段地址x16+偏移地址。这样CPU内部的寻址能力最大为FFFFH x 16 + FFFFH(1114095)大于1048576(2^20)。
三、段寄存器
8086CPU在方位内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址。提供段地址的部件就是段地址寄存器。8086CPU中有4个段地址寄存器:CS(代码寄存器)、DS(数据寄存器)、SS(堆栈段寄存器)、ES(扩展段寄存器)。
下图为CPU执行过程的流程图。
mov指令不能用于设置CS、IP的值,原因很简单,因为8086CPU没有提供这样功能。但是提供了jmp指令。jmp 段地址:偏移地址。