在CPU中:
运算器进行信息处理;
寄存器进行信息存储;
控制器控制各种器件进行工作;
内部总线来连接各种器件,在它们之间进行数据的传送。
对于汇编程序员来说,CPU中的主要器件是寄存器,寄存器是CPU中程序员可以用指令读写的部件。程序员可以通过改变各种寄存器中的内容来实现对CPU的控制。
不同的CPU的寄存器个数与结构是不相同的。8086CPU有14个寄存器,分别为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
8086CPU的所有寄存器都是16位的,可以存放两个字节的数据。
AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器。
AX、BX、CX、DX这4个寄存器都可以分为两个可独立使用的8位寄存器来使用。
出于对兼容性的考虑,8086CPU可以一次性处理以下两种储存的数据:
一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节存在寄存器的高8位寄存器和低8位寄存器中。
用十六进制可以直观地看出这个数据是由哪两个8位数据构成的。
汇编指令 | 控制CPU完成的操作 | 用高级语言的语法描述 |
---|---|---|
mov ax,18 | 将18送入寄存器AX | AX = 18 |
mov ah,18 | 将18送入寄存器AH | AH = 18 |
add ax,8 | 将寄存器AX中的数值加上8 | AX = AX + 18 |
mov ax,bx | 将寄存器BX中的数值送入寄存器AX | AX = BX |
add ax,bx | 将AX和BX中的数值相加,结果存在AX中 | AX = AX + BX |
CPU通过地址总线送入储存器的是一个内存单元的物理地址。
每一个内存单元在所有内存单元构成的内存空间有唯一的物理地址。
16位结构描述了一个CPU具有下面几方面的结构特性:
8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。
但是8086CPU是16位结构,表现出的寻址能力只有64KB。
8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
当8086CPU要读写内存时,先把两个16位的地址(分别叫做段地址和偏移地址)通过内部总线传入一个叫地址加法器的部件中,地址加法器采用 “ 物理地址 = 段地址 x 16 + 偏移地址 ” 的方法合成一个20位的物理地址,再用输入输出控制电路将物理地址送上地址总线。
更一般地说,8086CPU的这种寻址功能是 “ 基础地址 + 偏移地址 = 物理地址 ” 寻址模式。
其实内存并没有分段,段的划分来自CPU,由于CPU使用“段地址和偏移地址”的方式来给出物理地址,使得我们可以用分段的方式来管理内存。CPU的位数决定了一个内存段的长度。
段地址在8086CPU的段寄存器中存放。8086CPU有4个段寄存器:CS、DS、SS、ES。
CS和IP是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址。
CS为代码段寄存器,IP为指令指针寄存器。
在8086PC机中,任意时刻,8086CPU将从内存 M(CS中的内容) x 16 + N(IP中的内容)单元开始,读取一条指令并执行。
在CPU中,程序员能够用指令读写的部件只有寄存器,可以通过改变CS、IP中的内容实现对CPU的控制。
8086CPU大部分寄存器的值都可以用mov指令(又被称为传送指令)来改变,但是8086CPU没有提供mov修改CS、IP的功能,所以我们需要用另一个指令:jmp指令,来修改CS、IP寄存器的值。
“jmp 段地址:偏移地址” 指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP
对于8086CPU,在编程时,可以根据需要将一组内存单元定义为一个段。
可以将长度为N(N<=64KB)的一组代码存在一组地址连续、起始地址为16的倍数的内存单元中,从而定义了一个代码段。
要使得CPU将我们定义的代码段中的指令当作指令来运行,必须要将 CS: IP 指向所定义的代码段中的第一条指令的首地址。