寄存器
CPU 由运算器、控制器、寄存器构成,之间通过内部总线相连。
- 运算器进行信息处理
- 寄存器进行信息存储
- 控制器控制各种器件进行工作
- 内部总线连接各种器件,传送数据
8086CPU 有 14 个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
通用寄存器
8086CPU 所有寄存器都是 16 位的,可以存放两个字节。AX、BX、CX、DX 寄存器用来存放一般数据,称为通用寄存器。
8086CPU 上一代寄存器都是 8 位的,为保证兼容,AX、BX、CX、DX 寄存器都可以分为两个独立使用的 8 位寄存器。
- AX 分为 AH、AL
- BX 分为 BH、BL
- CX 分为 CH、CL
- DX 分为 DH、DL
L 表示 low,低 8 位;H 表示 high,高 8 位。
字
8086CPU 可以一次性处理两种尺寸的数据:
- 字节,一个字节由 8 个 bit 组成,可以存放在 8 位寄存器。
- 字,一个字由两个字节组成,高位字节、低位字节。
一个字可以存在一个 16 位寄存器中。
汇编指令
汇编指令 | 高级语言描述 |
---|---|
mov ax, 18 | ax = 18 |
mov ah, 78 | ah = 78 |
add ax, 8 | ax = ax + 8 |
mov ax, bx | ax = bx |
add ax, bx | ax = ax + bx |
ax 初始为 0x00c5,执行 add al, 0x93 后,ax = 0x0058。al 作为一个独立的 8 位寄存器使用,和 ah 没有关系,产生的进位不会存储在 ah。
在进行赋值或运算时要注意两个操作的寄存器的位数要一致。
检测点 2.1
(1)
0xf4a3
0x31a3
0x3123
0x6246
0x826c
0x6246
0x826c
0x04d8
0x0482
0x6c82
0xd882
0xd888
0xd810
0x6246
(2)
1 | mov ax,2 |
物理地址
8086 的地址总线宽度为 20。而 8086 是 16 位结构 CPU,在内部能一次处理、传输、暂存的信息最大长度为 16 位。
当 8086CPU 要读写内存时:
- 8086 接收两个 16 位地址,段地址、偏移地址
- 通过内部总线,送入地址加法器
- 地址加法器将段地址左移 4 位,再加上偏移地址
- 地址加法器将 20 位物理地址送入输入输出控制电路
- 输入输出控制电路将 20 位物理地址送上地址总线
- 20 位物理地址被地址总线传送到存储器
段地址
段起始地址一定是 16 的倍数,因为段地址 x 16 一定是 16 的倍数。偏移地址为 16 位,16 位寻址能力为 64KB,一个段最大长度为 64KB。
CPU 可以用不同的段地址和偏移地址形成同一个物理地址。
检测点 2.2
(1) 0010H 1000FH
(2) 1001H 2000H
段寄存器
8086CPU 在访问内存时需要段寄存器提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址。
有 4 个段寄存器:CS、DS、SS、ES。
C 的意思是 code,代码,S 是 segment,代码段
D 的意思是 data,数据,S 是 segment,数据段
S 的意思是 stack,栈,S 是 segment,栈段
CS 和 IP
CS 为代码段寄存器,IP 为指令指针寄存器。
CPU 将 CS:IP 指向的内容当做指令执行。
8086CPU 工作过程
- 从 CS:IP 指向的内存单元读取指令,读取的指令进入指令缓冲器
- IP = IP + 所读取指令的长度,从而指向下一条指令
- 执行指令,转到步骤 1,重复这个过程
8086CPU 开机时,CS = FFFFH,IP = 0000H,CPU 从内存 FFFF0H 单元读取指令执行。
修改 CS、IP 的指令
可以通过改变 CS、IP 的内容来控制 CPU 执行目标指令。
修改 CS 和 IP:
1 | jmp 段地址:偏移地址 |
jmp 2ae3:3
执行后,CS = 2ae3H,IP = 0003H
只修改 IP:
1 | jmp 寄存器 |
jmp ax
,将 IP 设置为 ax 寄存器中的内容。
代码段
8086PC 机,在编程时可以将一组内存单元定义为一个段,可以将长度为 N(N ≤ 64KB) 的一组代码放在一组地址连续,起始地址为 16 倍数的内存单元中。