寄存器

CPU 由运算器、控制器、寄存器构成,之间通过内部总线相连。

  1. 运算器进行信息处理
  2. 寄存器进行信息存储
  3. 控制器控制各种器件进行工作
  4. 内部总线连接各种器件,传送数据

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 位寄存器。

  1. AX 分为 AH、AL
  2. BX 分为 BH、BL
  3. CX 分为 CH、CL
  4. DX 分为 DH、DL

L 表示 low,低 8 位;H 表示 high,高 8 位。

16 位寄存器分为两个 8 位寄存器

8086CPU 可以一次性处理两种尺寸的数据:

  1. 字节,一个字节由 8 个 bit 组成,可以存放在 8 位寄存器。
  2. 字,一个字由两个字节组成,高位字节、低位字节。

一个字可以存在一个 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
2
3
4
mov ax,2
add ax,ax
add ax,ax
add ax,ax

物理地址

8086 的地址总线宽度为 20。而 8086 是 16 位结构 CPU,在内部能一次处理、传输、暂存的信息最大长度为 16 位。

当 8086CPU 要读写内存时:

  1. 8086 接收两个 16 位地址,段地址、偏移地址
  2. 通过内部总线,送入地址加法器
  3. 地址加法器将段地址左移 4 位,再加上偏移地址
  4. 地址加法器将 20 位物理地址送入输入输出控制电路
  5. 输入输出控制电路将 20 位物理地址送上地址总线
  6. 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 工作过程

  1. 从 CS:IP 指向的内存单元读取指令,读取的指令进入指令缓冲器
  2. IP = IP + 所读取指令的长度,从而指向下一条指令
  3. 执行指令,转到步骤 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 倍数的内存单元中。