第 2 章 寄存器
在 CPU 中:
- 运算器处理信息
- 寄存器储存信息
- 控制器控制各种器件
- 内部总线连接各种器件,在他们之间传输数据
对汇编程序员最重要的部件就是寄存器,寄存器是程序员可以用指令读写的部件,程序员通过改变寄存器中的内容实现对 CPU 的控制。
不同 CPU 寄存器个数和结构是不同的。
2.1 通用寄存器
8086 中所有寄存器为 $16$ 位,可以存放两个字节。
通用存储器:用来存放一般数据的存储器 AX, BX, CX, DX
为向前兼容,这四个寄存器也可以分成两个 8 位寄存器:
AX -> AH AL
BX -> BH BL
CX -> CH CL
DX -> DH DL
H 对应高位 L 对应低位
2.2 字在寄存器中的存储
8086 可以一次性处理两种尺寸的数据
字节 byte -> 8 bit
字 work -> 2 byte
2.3 几条汇编指令
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
; 后为对应高级语言的描述
寄存器名称不区分大小写
2.4 物理地址
所有内存单元构成的存储空间是一个一维的线性空间,每个内存单元都有唯一的地址,称为物理地址。
CPU 通过地址线送入寄存器的必须是一个物理地址,在发出物理地址前必须在内部先形成物理地址。
2.5 16 位结构的 CPU
- 运算器一次最多处理 $16$ 位数据
- 寄存器最大宽度为 $16$ 位
- 寄存器与运算器之间的通路为 $16$ 位
2.6 8086CPU 给出物理地址的方法
8086 有 20 位地址,但 8086 是 16 位结构,所以采用两个 16 位地址合成一个 20 位地址合成一个 20 位物理地址。这两个地址分别称为段地址和偏移地址。
8086 将这两个地址传入到一个地址加法器,加法器利用如下公式计算物理地址 $$物理地址 = 段地址 \times 16 + 偏移量$$
2.7 “段地址 X 16 + 偏移量 = 物理地址” 的本质含义
$段地址 \times 16$ -> 基础地址
注意乘 $16$ 相当于二进制左移 $4$ 位。
$基础地址 + 偏移量 = 物理地址$
2.8 段的概念
注意段与段地址概念不相关。
若干的内存单元可以视作一个段,段的其实地址必然是一个基础地址,之后用偏移量定位段中的 内存单元。一个段的最大长度对应了一个基础地址覆盖的范围(16位的寻址能力 64KB)。
如 21F60H 地址一般说 “2000:1F60 单元”或 “2000H 段中的 1F60H 单元”。
2.9 段寄存器
8086 有以下 4 个用来存储段地址的寄存器:CS,DS,SS,ES
2.10 CS 和 IP
CS 为代码段寄存器。
IP 为指令指针寄存器。
任意时刻 CS:IP 指向内容为要执行的指令。
(1)读取 CS:IP 指向位置的指令,读取的指令进入指令缓冲器
(2)IP = IP + 所读指令长度 (指向下一条指令)
(3)执行指令。转到步骤(1)
2.11 修改 CS、IP 的指令
可以使用 jmp 指令修改 CS 和 IP 的值
jmp 3:0B16 ; CS = 0003H, IP = 0B16H
imp ax ; IP = AX
2.12 代码段
可以将一组内存单元设置为一个段,如果这个段是存放的执行代码,则称为代码段。
将 CS:IP 指向代码段开头,则 CPU 将会执行对应的代码。
Next: [Luogu] P4588 [TJOI2018]数学计算