汇编的那些事

一、16位CPU的结构

1.8086CPU有20位地址总线,可以传送20位地址,达到1MB的寻址能力,它又是16位结构,在内部一次性处理、传输、暂存的地址为16位,从内部结构来看,假如地址从内部简单发出,那么它只能送出16位的地址,表现出的寻址能力只有64KB。

8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。其相关部件的逻辑结构如图1所示


                                                    图1 8086CPU相关部件的逻辑结构图

8086CPU要读写内存时:

(1)CPU中的相关部件提供两个16位的地址,段地址和偏移地址;

(2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;

(3)地址加法器部件将16位地址合成为一个20位的物理地址;

(4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路;

(5)输入输出控制电路将20位物理地址送上地址总线;

(6)20位物理地址被地址总线传送到寄存器。

地址加法器采用物理地址=段地址*16+偏移地址的方法用段地址和偏移地址合成物理地址。例如要访问地址为123C8的内存单元,此时地址加法器的工作过程如图2所示:


                                                                图2 地址加法器的工作过程

2.段

内存并没有分段,段的划分来自于CPU,由于8086CPU用“基础地址+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式管理内存,如图3所示我们可以认为地址10000H~100FFH的内存单元组成一个段,该段的起始地址为10000H,段地址为1000H,大小为100H;我们也可以认为地址为10000H~1007F、10080H~100FFH的内存单元组成两个段,它们的起始地址分别为10000H和10080H,段地址分别为1000H和1008H,大小都为80H。


                                                                    图3 段的划分

段*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数,偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。即偏移地址为16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元,比如给定段地址为1000H,用偏移地址寻址,CPU的寻址范围为10000H~1FFFFH。

段地址在8086CPU的段寄存器中存放,8086有4个段寄存器:CS、DS、SS、ES。当8086CPU要访问内存时由这4个段寄存器提供内存单元的地址。

3.CS和IP

CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址,CS为代码段寄存器,IP为指令指针寄存器,在8086PC中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M*16+N单元开始读取一条指令并执行。也可以理解为任意时刻CPU将CS:IP指向的内容当作指令执行。8086CPU读取、执行指令的工作原理如图4所示:


                                                                图4 8086CPU读取和执行指令的相关部件

图解:

(1)当前8086CPU状态:CS中的内容为2000H,IP中的内容为0000H;

(2)内存20000H~20009H单元存放着可执行的机器代码;

(3)内存20000H~20009H单元存放的机器码对应的汇编指令如下:

地址20000H~20002H,内容为B8 23 01,长度为3B,对应汇编指令:mov ax,0123H;

地址20003H~20005H,内容为BB 03 00,长度为3B,对应汇编指令:mov bx,0003H;

地址20006H~20007H,内容为89 D8,长度为2B,对应汇编指令:mov ax,bx;

地址20008H~20009H,内容为01 D8,长度为2B,对应汇编指令:add ax,bx;

读取一条指令后IP的值自动增加,以使CPU读取下一条指令。8086CPU的工作过程可以简要描述如下:

(1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;

(2)IP=IP+所取指令长度,从而指向下一条指令;

(3)执行指令,转到步骤(1)重复过程。

8086CPU加电启动或复位后CS和IP被设置为CS=F000H,IP=FFFFH,即在8086PC机刚启动时,CPU从内存FFFF0H中读取指令执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。

MOV指令不能用于设置CS和IP的值,原因很简单,因为8086CPU没有提供这样的功能,能够改变CS、IP内容的指令被统称为转移指令,其中一个为jmp指令;

若想同时修改CS、IP的内容,可用指令“jmp 段地址:偏移地址”完成,如:

jmp 2AE3:3,执行后CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令。

jmp 3:0B16,执行后,CS=0003H,IP=0B16H,CPU将从00B46处读取指令。

若想仅修改IP的内容,可用指令“jmp某一合法寄存器”完成,如:

jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H;

           指令执行后:ax=1000H,CS=2000H,IP=1000H;

jmp bx,指令执行前:bx=0B16H,CS=2000H,IP=0003H;

              指令执行后:bx=0B16H,CS=2000H,IP=0B16H;


猜你喜欢

转载自blog.csdn.net/wangshuping18/article/details/80041257