《汇编语言》 笔记 第 2 章 寄存器
Notes 汇编语言
Lastmod: 2020-09-13 周日 21:08:33

第 2 章 寄存器

在 CPU 中:

  1. 运算器处理信息
  2. 寄存器储存信息
  3. 控制器控制各种器件
  4. 内部总线连接各种器件,在他们之间传输数据

对汇编程序员最重要的部件就是寄存器,寄存器是程序员可以用指令读写的部件,程序员通过改变寄存器中的内容实现对 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

  1. 运算器一次最多处理 $16$ 位数据
  2. 寄存器最大宽度为 $16$ 位
  3. 寄存器与运算器之间的通路为 $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 将会执行对应的代码。

Prev: 《汇编语言》 笔记 第 1 章 基础知识
Next: [Luogu] P4588 [TJOI2018]数学计算