目录
《汇编语言》第二章:寄存器
📌 主要内容
本章从汇编语言中最基本的“寄存器”概念出发,系统介绍了 8086 CPU 的寄存器结构、物理地址的形成方式、段与偏移的关系以及代码段的基本运作机制。
重点包括:
- 通用寄存器与段寄存器的功能和组成;
- 数据在寄存器中的存储方式;
- 汇编指令的作用与编码行为;
- 段地址 × 16 + 偏移地址 = 物理地址的本质含义;
- CS、IP、代码段与程序执行流程的关系。
🧠 笔记重点
2.1 通用寄存器
-
8086 CPU 共有 4 个通用寄存器,每个 16 位:
AX
、BX
、CX
、DX
-
每个通用寄存器可拆分为两个 8 位寄存器:
- 例如:
AX
可拆为AH
(高 8 位)和AL
(低 8 位)
- 例如:
-
通用寄存器可用于存放数据、参与运算、访问内存地址等。
2.2 字在寄存器中的存储
- 在 8086 结构中,一个字(16 位)是以两个字节表示的:
- 低地址存低字节,称为小端模式
- 示例:
AX = 1234H
,在内存中为:34H(低地址)
、12H(高地址)
2.3 几条汇编指令
- 常见数据传送与操作指令:
MOV AX, BX
:将 BX 中的数据复制到 AXADD AX, 1
:AX 加 1SUB AX, BX
:AX 减去 BX 的值
- 指令的一般形式为:
操作码 目的操作数, 源操作数
2.4 物理地址
- CPU 实际访问的是物理地址,但程序中使用的是“段地址 + 偏移地址”
- 8086 中地址总线为 20 位 ⇒ 2^20 = 1MB 地址空间
- 段地址左移 4 位(即 ×16)后加上偏移地址 = 物理地址
- 示例:
段地址 = 1000H, 偏移地址 = 0010H
- 物理地址 =
10000H + 10H = 10010H
2.5 16 位结构的 CPU
- 8086 是 16 位 CPU ⇒ 内部数据总线为 16 位 ⇒ 一次可以传输 2 字节
- 所有通用寄存器为 16 位
- 指令操作的数据长度默认为 16 位,除非特别说明使用 8 位
2.6 8086CPU给出物理地址的方法
- 利用段寄存器(如
CS
、DS
、SS
等)和偏移地址一起生成物理地址:物理地址 = 段寄存器值 × 16 + 偏移地址
2.7 “段地址×16+偏移地址=物理地址”的本质含义
- CPU 通过段寄存器得到段的起始地址(段地址左移 4 位)
- 偏移地址指定在段内的偏移量
- 本质上:段寄存器控制“访问哪一段内存”,偏移地址控制“访问该段内的哪个位置”
2.8 段的概念
- 为了简化编程,将内存分为逻辑上的不同“段”
- 代码段(CS):存放程序指令
- 数据段(DS):存放变量、常量
- 栈段(SS):支持子程序调用、临时数据保存
- 每个段最多 64KB 大小(因为偏移地址是 16 位)
2.9 段寄存器
- 8086 提供 4 个段寄存器:
CS
(代码段)DS
(数据段)SS
(栈段)ES
(附加段)
- 使用场景示例:
mov ax, [0]
默认从 DS:0000 读入内存数据- 若需访问 ES 段,可用
mov ax, es:[0]
2.10 CS 和 IP
CS
(Code Segment):指定代码所在的段IP
(Instruction Pointer):指令偏移地址- 指令执行地址 =
CS × 16 + IP
- 示例:
CS = 0A00H, IP = 0010H
⇒ 执行指令地址为0A010H
2.11 修改 CS、IP 的指令
- 一般程序无法直接修改 CS 和 IP
- 需通过控制转移指令间接实现,例如
JMP
、CALL
- 示例:
JMP 1234H
2.12 代码段
- 程序指令必须放在代码段中,由 CS 寄存器指向
- 执行过程中,CPU 使用 CS:IP 定位指令地址,逐条执行
- 示例程序结构:
assume cs:code code segment start: mov ax, 0000 add ax, 0123H mov bx, ax jmp bx code ends end start
💻 实验1:查看CPU和内存,用机器指令和汇编指令编程
- 使用
DEBUG
查看内存内容、寄存器状态、反汇编指令:R
:查看寄存器D
:查看内存中的内容U
:反汇编查看指令E
:编辑内存内容T
:执行一条机器指令A
:以汇编指令的格式在内存中写入一条机器指令
- 示例步骤:
- debug - a 2000:0 mov ax, 1 add ax, ax jmp 2000:0003 - RCS :2000 - RIP : 0 - t
✅ 检测点 2.1
(1)写出每条汇编指令执行后相关寄存器中的值
mov ax,62627 AX=F4A3H
mov ah,31h AX=31A3H
mov al,23h AX=3123H
add ax,ax AX=6246H
mov bx,826CH BX=826CH
mov cx,ax CX=6246H
mov ax,bx AX=826CH
add ax,bx AX=04D8H
mov al,bh AX=0482H
mov ah,bl AX=6C82H
add ah,ah AX=D882H
add al,6 AX=D888H
add al,al AX=D810H
mov ax,cx AX=6246H
(2)只能使用目前学过的汇编指令,最多使用4条命令,编程计算2的4次方。
mov ax,2
add ax,ax
add ax,ax
add ax,ax
✅ 检测点 2.1
(1) 00010H 1000FH
(2) 1001H 2000H
✅ 检测点 2.3
(1) 四次
(2) 第一次读取mov ax,bx, 第二次读取sub ax,ax,第三次读取jmp ax,第四次执行jmp ax
(3) 假设CS=a,IP=b
执行完mov ax,bx CS=a,IP=b+2 ,ax=bx
执行完sub ax,ax CS=a,IP=b+4 ,ax=0
执行完jmp ax CS=a,IP=b+6,ax=0
最后执行jmp ax,此时IP=ax=0
🔍 拓展理解
- 学会使用调试工具 DEBUG,掌握 CPU 寄存器与内存的关系;
- 理解“段”结构是深入学习汇编语言与操作系统的关键;
- 掌握“物理地址”的形成过程,有助于理解指针与存储机制。