Chapter 2: 寄存器¶
约 983 个字 预计阅读时间 3 分钟
8086 CPU 中共有 14 个寄存器,所有寄存器都是 16 位的,分别为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
通用寄存器¶
在 8086 CPU 中 AX、BX、CX、DX 通常用以存放一般性数据,被称为通用寄存器。为保证与上一代 8 位寄存器 CPU 的兼容性,8086 CPU 的这 4 个寄存器都可分为两个可独立使用的 8 位寄存器来使用:
- AX 可分为 AH 和 AL,其中低 8 位为 AL,高 8 位为 AH
- BX 可分为 BH 和 BL
- CX 可分为 CH 和 CL
- DX 可分为 DH 和 DL
同样地,出于对兼容性的考虑,8086 CPU 可以处理以下两种尺寸的数据:
- 字节:记为 byte,1 byte = 8 bit
- 字:记为 word,1 word = 2 byte,这两个 byte 分别称为这个 word 的高位字节和低位字节
在进行数据传送或运算时,指令的两个操作对象的位数应当保持一致。
物理地址¶
每一个内存单元在其所构成的存储空间中对应的唯一的地址称为物理地址。
16 位结构描述了一个 CPU 以下几方面的结构特性:
- 运算器一次最多可以处理 16 位的数据
- 寄存器的最大宽度为 16 位
- 寄存器和运算器之间的通路为 16 位
8086 CPU 有 20 位地址总线,但其同时为 16 位结构,即在内部一次性处理、传输、暂时存储的地址为 16 位。因此,8086 CPU 采用在内部用两个 16 位地址合成的方法形成一个 20 位物理地址。
内部的两个 16 位地址分别称为段地址和偏移地址,它们经过地址加法器后,按照 \(\text{物理地址} = \text{段地址} \times 16 + \text{偏移地址}\) 的方法合成物理地址,之后送入输入输出控制电路,通过地址总线到达存储器。
8086 CPU 的这种寻址功能是 基础地址 + 偏移地址 = 物理地址 寻址模式的一种具体实现方案。
实际上,物理内存没有分段,段的划分来自于 CPU。可以根据需要将若干地址连续的内存单元看作一个段,用段地址 \(\times\) 16 定位段的起始地址,用偏移地址定位段中的内存单元。给定一个段地址,仅通过偏移地址进行寻址,最多可寻 64 KB 个内存单元。同一个物理地址可以有多种段地址和偏移地址的逻辑表示。
在 8086 PC 机中,存储单元的地址应用段地址和偏移地址共同描述。如对于 21F60H 内存单元,通常有两种类似说法:
- 2000:1F60 单元
- 2000H 段 1F60H 单元
段寄存器¶
段地址在 8086 CPU 的段寄存器中存放,共有 4 个段寄存器:CS、DS、SS、ES。
其中,CS 为代码段寄存器,IP 为指令指针寄存器。设 CS 中内容为 M,IP 中内容为 N,8086 CPU 将从内存单元 \(M \times 16 + N\) 开始读取一条指令并执行,即任意时刻 CPU 将 CS:IP 指向的内容当作指令执行。读取一条指令后 IP 自增所读取指令的字节长度,以使 CPU 可以读取下一条指令。
8086 CPU 加电启动或复位后 CS 和 IP 被设置为 CS = FFFFH,IP = 0000H,即 CPU 所执行的第一条指令为 FFFF0H 单元中的指令。
我们可以将一组代码存放在一组地址连续、起始地址为 16 倍数的内存单元中,从而定义一个代码段。这只是编程时人为的安排,CPU 并不会自动的将代码段中的指令认为是指令而执行。可通过设置 CS 和 IP 的值来执行代码段的内容。