~~ 这是关于王爽著汇编语言的读书笔记,或者说是书中一些重要内容的摘抄。~~ 好了,现在已经变成汇编语言的学习心得了。

# 基础知识

汇编课程的研究重点在于如何利用硬件系统的编程结构和指令集有效灵活地控制系统进行工作

BIOS (Basic Input/Output System, 基本输入输出系统) 是由主板和各类接口卡 (如显卡、网卡等) 厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出。

8086 的地址总线宽度为 20 位,即其内存地址空间大小为 1MB. 其机内地址空间的基本分配情况如下:

地址00000-9FFFFA0000-BFFFFC0000-FFFFF
作用主存储器地址空间 (RAM)显存地址空间各类 ROM 地址空间

因此,在 8086 中,向 C0000 至 FFFFF 中写入数据的操作是无效的。

在 8086 中,20 位物理地址采用两个 16 位地址合成的方法给出。具体操作为物理地址 = 段地址 ×16 + 偏移地址。对应的逻辑结构如下:

显然,在这种地址表示下,每一个物理地址对应的段地址和偏移地址不是唯一的。

# 寄存器

# 概述

8086CPU 有 14 个寄存器,均为 16 位寄存器。每个寄存器有一个名称。这些寄存器是: AX, BX, CX, DX, SI, DI, SP, BP, IP, CS, SS, DS, ES, PSW.

# 通用寄存器

AX (accumulator), BX (base), CX (count), DX (data) 是通用寄存器。在保持兼容性的要求下,每个寄存器可以拆分为两个寄存器使用。如 AX 可以拆分为 AH (高 8 位) 和 AL (低 8 位),其余同理。以上通用寄存器中,不同寄存器的区别体现在:

  1. AX 作为累加器,是算术运算的主要寄存器。另外,所有的 I/O 指令都使用这一寄存器与外部设备传送信息。
  2. BX 在计算存储器地址时,常用作基址寄存器。
  3. CX 常用来保存计数值,如在移位指令、循环和串处理指令中用作隐含的计数器。
  4. DX 一般在作双字长运算时与 AX 组合在一起存放一个双字长数, DX 用来存放高位字。此外,对某些 I/O 操作,DX 可用来存放 I/O 的端口地址。

# 变址寄存器

SP (stack pointer), BP (base pointer), SI (source index), DI (destination index) 称为指针寄存器变址寄存器

# 段寄存器

段寄存器 (segment register) 存放段地址,包括 CS, DS, SS, ES. 其中,CS 是代码段寄存器 (code segment),DS 是数据段寄存器 (data segment),SS 是栈段寄存器 (stack segment),ES 是扩展寄存器 (extended segment). 在汇编程序中,一般采用如下的伪指令进行寄存器说明:

ASSUME CS: CODESG, DS: DATASG

# 标志寄存器

标志寄存器 (flag register) 又称状态寄存器 (status register) 或程序状态字 (program status word, PSW). 其在 x86 CPU 中存在,用于存储 CPU 当前的状态,例如 ALU 运算结果的部分辅助信息。

8 位的 Intel 8085 中标志寄存器共 5 位有效,其结构如下所示:

76543210
SZACPCY

其具体功能可以参考 Geeks for Geeks: Flag register in 8085 microprocessor.

16 位的 Intel 8086 标志寄存器是在 8085 上发展得来的,其结构如下:

1514131211109876543210
OFDFIFTFSFZFAFPFCF

具体功能可以参考 Geeks for Geeks: Flag register of 8086 microprocessor.

# 存储器

# 汇编程序编写基础

# debug

# 进入

对于采用 MASM 5.0 编写的汇编程序,其 debug 过程可以在 dos 窗口中完成。只需要运行

debug TEST.exe

就可以进入 TEST.exe 程序的 debug 过程。

# debug 常见指令

参考 DOS 的 debug 命令大全

指令功能
-uunassemble, 即反汇编。默认反汇编 80 字节。
-g[add]go, 即从地址 add 处开始运行
-d[add]dump, 从某地址开始显示主存内容
-r[reg]register, 即修改某一寄存器的值