前言
8086 CPU 有 14 个寄存器,每个寄存器有一个名称。这些寄存器是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW
一、通用寄存器
8086 CPU 的所有寄存器都是 16 位的,可以存放两个字节。AX、BX、CX、DX 这 4个寄存器通常用来存放一般性的数据,被称为通用寄存器。
8086 CPU 的上一代 CPU 中的寄存器都是 8 位的。
为了保证兼容,使原来基于上代 CPU 编写的程序稍加修改就可以运行在 8086 之上,8086 CPU 的 AX、BX、CX、DX 这 4个寄存器都可分为两个可独立使用的8位寄存器来用:
1. AX 可分为 AH 和 AL;
2. BX 可分为 BH 和 BL;.
3. CX 可分为 CH 和 CL;
4. DX 可分为 DH 和 DL。
AX 的低 8 位(0 位~7 位) 构成了 AL 寄存器,高 8位(8 位~15 位) 构成了 AH 寄存器。AH 和 AL 寄存器是可以独立使用的 8 位寄存器。
二、字在寄存器中的存储
出于对兼容性的考虑,8086 CPU 可以一次性处理以下两种尺寸的数据。
字节:记为 byte,一个字节由8个bit组成,可以存在8位寄存器中。
字:记为 word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。
三、汇编指令
书中案例分析,请计算最后 ax 寄存器的值
程序段中的最后一条指令 add ax,bx,在执行前 ax 和 bx 中的数据都为 8226H,相加后所得的值为:1044CH,但是 ax为16 位寄存器,只能存放4位十六进制的数据,所以最高位的1不能在 ax 中保存,ax 中的数据为:044CH。
请计算 al 寄存器的值
程序段中的最后一条指令 add al,93H,在执行前,al 中的数据为 C5H,相加后所得的值为:158H,但是 al 为8位寄存器,只能存放两位十六进制的数据,所以最高位的1丢失,ax 中的数据为:0058H
这里如果将 al 换成 ax 则结果为 0158 H(注意区分八位和十六位寄存器)
在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的,例如:
mov ax,bx
mov bx,cx
mov ax,18H
mov al,18H
add ax,bx
add ax,20000
答案解析:
四、物理地址
每一个内存单元都有唯一的地址,我们将这个唯一的地址称为物理地址。
五、8086 CPU 给出物理地址的方法
8086CPU 采用一种在内部用两个 16 位地址合成的方法来形成一个 20 位的物理地址
1. CPU 中的相关部件提供两个 16 位的地址,一个称为段地址,另一个称为偏移地址;
2. 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件:
3. 地址加法器将两个16 位地址合成为一个20位的物理地址;
4. 地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
5. 输入输出控制电路将20位物理地址送上地址总线;
6. 20位物理地址被地址总线传送到存储器。
地址加法器采用物理地址=段地址x16+偏移地址的方法用段地址和偏移地址合成物理地址
六、段
如图 2.9 所示,我们可以认为:地址10000H~100FFH 的内存单元组成一个段,该段的起始地址(基础地址)为 10000H,段地址为 1000H,大小为 100H
我们也可以认为地址 10000H~1007FH、10080H~100FFH 的内存单元组成两个段,它们的起始地址(基础地址)为:10000H和10080H,段地址为:1000H和1008H,大小都为 80H。
答案解析:从最小为 0H,最大 FFFFH 计算
七、段寄存器
8086 CPU 有4个段寄存器:CS、DS、SS、ES
八、CS 和 IP
CS 和 IP 是 8086 CPU 中两个最关键的寄存器,它们指示了 CPU 当前要读取指令的地址。CS 为代码段寄存器,IP 为指令指针寄存器
8086 机中,任意时刻,CPU 将 CS:IP 指向的内容当作指令执行
图 2.10 说明如下:
1. 8086CPU 当前状态:CS 中的内容为2000H,IP中的内容为0000H;
2. 内存 20000H~20009H 单元存放着可执行的机器码:
九、修改 CS、IP 指令
mov 指令不能用于设置 CS、IP 的值!!!
若想同时修改 CS、IP 的内容,可用形如“jmp 段地址:偏移地址”的指令完成,例如
jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU 将从 2AE33H 处读取指令。
jmp 3:0B16,执行后:CS0003H,IP=0B16H,CPU 将从 00B46H 处读取指令。
若想仅修改 IP 的内容,可用形如 “jmp 某一合法寄存器” 的指令完成
“jmp 某一合法寄存器” 指令的功能为:用寄存器中的值修改 IP
答案解析:四次,jmp 前后各一次