8086CPU有14个寄存器,分别是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
2.1 通用寄存器
8086CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,称为通用寄存器。
8086CPU的AX、BX、CX、DX这4个寄存器可以分为两个独立使用的8位寄存器:
(1)AX可以分为AH和AL;
(2)BX可以分为BH何BL;
(3)CX可以分为CH何CL;
(4)DX可以分为DH何DL;
2.2 物理地址
所有的内存单元构成的内存空间是一个一维的线性空间,每一个内存单元在这个空间中有唯一的地址,成这个唯一的地址为物理地址。
2.3 8086CPU给出物理地址的方法
8086CPU是16位结构,这就是说在8086内部,能够一次性处理、传输、暂时存储的最大长度为16位。8086CPU有20位地址总线,可以传送20位地址。8086CPU又是16位结构,只能送出16位地址。8086CPU采用一种在内部使用两个16位地址合成的方法形成20位物理地址。相关部件的逻辑结构如下图所示:
图1 8086CPU相关部件的结构
如图1所示,当8086CPU读写内存时:
(1)CPU中的相关部件提供两个16位的地址,一个称为段地址,一个称为偏移地址;
(2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
(3)地址加法器将两个16位地址合成一个20位的物理地址(物理地址=段地址*16+偏移地址):
(4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
(5)输入输出控制电路将20位物理地址送上地址总线:
(6)20位物理地址被地址总线传送到寄存器。
2.4 段寄存器
8086CPU有4个段寄存器:CS、DS、SS、ES。
2.4.1 CS段寄存器
CS和IP指示CPU当前要读取指令的地址。CS:IP指向的内容当做指令执行。CS为代码段寄存器,IP为指令指针寄存器。
同时修改CS、IP的内容,可使用形如 “jmp 段地址:偏移地址”,jmp 2AE3:3执行后,CS=2AE3,IP=3,CPU从2AE33H处读取指令。“jmp 段地址:偏移地址”指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP。
若仅修改IP的内容,可用“jmp 某一合法寄存器”的指令来完成,用寄存器中的值修改IP,如jmp ax。
2.4.2 DS段寄存器和[address]
DS寄存器用于存放要访问数据的段地址。[address]表示一个偏移地址为address的内存单元,CPU使用DS*16+address做为数据的地址来访问相应地址单元中的数据。
mov ax ,123BH //将数据123BH传递给ax
mov ds ,ax //将ax中的数据传递给段寄存器ds
mov ax ,0 //将ax寄存器赋值为0
add ax,[0] //将数据段第一个字(偏移地址为0)加到ax中
2.4.3栈段寄存器
8086CPU中,段寄存器SS和寄存器SP,栈顶放在SS中,偏移地址放在SP中。任意时刻,SS:SP指向栈顶元素。push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址。
push为入栈指令形式为,push 寄存器,表示将一个寄存器中的数据入栈。如push ax,由以下两步完成:
(1)SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶
(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新的栈顶
push指令 格式包含如下:
push 寄存器
push 段寄存器
push 内存单元
pop指令为出栈指令,形式为 pop 寄存器,表示将一个寄存器中的数据出栈。如pop ax,由以下两步完成:
(1)将SS:SP指向的内存单元处的数据送入ax中;
(2)SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
pop指令 格式包含如下:
pop 寄存器
pop 段寄存器
pop 内存单元
段的综述
可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。可以用一个段存放数据,将它定义为“数据段”;对于一个数据段,将它的段地址放在DS中,用mov、add、sub等访问内存单元的指令时,CPU将我们定义的数据段中的内容当做数据来访问;
可以用一个段存放代码,将它定义为“代码段”;将它的段地址放在CS中,将段中第一条指令的偏移地址放在IP中,这样CPU将执行我们定义的代码段中的指令;
可以用一个段当做栈,将它定义为“栈段”;对于栈段,将它的段地址放在SS中,将栈顶的偏移地址放在SP中,这样CPU执行栈操作时,比如执行pop、push等指令,就将我们定义的栈段当做栈空间使用。
一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么也不是。关键在于CPU中寄存器的设置,即CS、IP,SS、SP,DS的指向。