《汇编语言》- 读书笔记 - 实验1 查看 CPU 和内存,用机器指令和汇编指令编程
- 实验 1 查看 CPU 和内存,用机器指令和汇编指令编程
- 1. 预备知识: Debug 的使用
- r 修改或显示寄存器的值
- d 查看内存数据
- e 编辑内存中指定地址的内容
- u 显示代码
- t 单步执行一条指令
- a 写入汇编指令
- g 执行到指定位置
- n 指定文件名
- L 加载文件
- W 保存文件
- 2. 实验任务
- 1. 使用 Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后 CPU 中相关寄存器中内容的变化。
- 2. 将下面 3 条指令写入从 2000:0 开始的内存单元中,利用这 3 条指计算 2 的 8次方。
- 3. 查看内存中的内容
- 4. 向内存从 B8100H 开始的单元中填写数据
- 参考资料
实验 1 查看 CPU 和内存,用机器指令和汇编指令编程
1. 预备知识: Debug 的使用
Debug 是 DOS、Windows 都提供的实模式(8086 方式)程序的调试工具。使用它,可以查看 CPU 各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。
| 参数 | 说明 |
|---|---|
| r | 修改、显示寄存器内容 |
| d | 查看内存数据内容 |
| e | 编辑内存中指定地址的内容 |
| u | 机器码转汇编代码显示 |
| a | 写入汇编指令 |
| t | 单步执行一条指令 |
| p | 同 t ,但说到中断或call时会进入子程序 |
| g | 执行到指定位置 |
| q | 退出 debug |
| ? | 查看帮助 |
| n | 指定文件名。用于读写文件。要配合L或W使用。 |
| L | 加载文件 |
| W | 写入文件 |

r 修改或显示寄存器的值
| 命 令 ——— | 示 例 — | 说明 |
|---|---|---|
r | r | 查看所有寄存器 |
r 寄存器 | r ax | 查看ax寄存器。回车后下一行会出现冒号提示符号。不要输入,直接回车。 |
r 寄存器:新值 | r ax:9527 | 查看ax寄存器。回车后下一行会出现冒号提示符号。输入新值,回车完成修改。ax 的值变为 9527 |
最下面一行还列出了当前CS:IP指向位置的机器码还显示了对应的汇编指令。

d 查看内存数据
d 查看目录地址内容,可指定开始位置,和查看多少位。(为了方便,我先设置了DS,所以只写偏移地址就够了)
| 命 令 ———————————— | 示例 | 说明 |
|---|---|---|
d | d | 不给参数默认查看 ds:0100 到 ds:017f |
d 数据段:偏移 | d 0100 | 指定查看的开始位置。等同于 d ds:0100。(默认现实128字节) |
d 数据段:开始偏移 结束偏移 | 指定查看的开始位和结束位置。 |

左:每行起始地址。
中:从指定地址开始的 128 个字节内容。(16进制)
右:每个内存单元中数据对应的ASCII码。(无对应ASCII码的显示 .)
e 编辑内存中指定地址的内容
| 命 令 —————————————— | 示 例 ————————— | 说明 |
|---|---|---|
e 数据段:偏移 | e ds:0 | 修改ds:0 处的数据。回车后会显示原值,输入后,空格可以继续修改下一个字节。 |
e 数据段:偏移 数据1 数据2 数据n | e 0 8 9 A B C D E F | 从ds:0 开始修改8个字节。 |

u 显示代码
- 默认中从代码段的开头开始显示。
- 也可以指定显示的
开始位置。 - 也可以指定显示的
开始-结束位置。
| 命 令 —————————————— | 示 例 ————————— | 说明 |
|---|---|---|
u | u | 显示当前CS:IP所指位置的汇编指令。 |
u 数据段:偏移 | u 076E:0000 | 显示 ds=076EH, ip=0000H 处的汇编指令。 |
u 偏移 | u 0000 | 简写:段地址从DS取, ip = 0000H 处的汇编指令。 |
u 开始地址 偏移 | u 076E:0000 0029 | 显示 076E:0000 到 076E:0029 范围的汇编指令。 |


t 单步执行一条指令
| 命 令 —————————————— | 示 例 ————————— | 说明 |
|---|---|---|
t | t | 回车后,单步执行一条指令。 |
t 条数 | t 3 | 回车后,一下执行 3 条指令。 |
t =cs:ip 3 | t =000:0200 3 | 回车后,从 000:0200位置开始,一下执行 3 条指令。 |
这没啥好说的,t 回车就行了。
- debug调试时,可以先用 a 向目标地址写代码。
- 修改 CS:IP 指向目标地址。
- 按 t 执行。

a 写入汇编指令
输入 a 回车后,就进入输入模式。
每向一条输入一条。
左边是debug自动显示的地址,我们在后面输入的指令回车即可。
| 命 令 —————————————— | 示 例 ————————— | 说明 |
|---|---|---|
a | a | 回车后,从当前 CS:IP指向位置开始写汇编指令。 |
a 数据段:偏移 | a 0740:0100 | 回车后,从 0740:0100 处理开始写汇编指令。 |

g 执行到指定位置
| 命 令 —————————————— | 示 例 ————————— | 说明 |
|---|---|---|
g | g | 回车后,执行到结束。 |
g 数据段:偏移 | a 1000:0001 | 回车后,执行到 1000:0001。 |
g 偏移 | a 0001 | 上面的简写。段地址从 CS 中取。 |

n 指定文件名
该命令可用于在启动程序后将文件加载到DEBUG的内存中,但它的主要功能是在操作系统的控制下创建一个新文件,DEBUG可以向该文件写入数据。
注意:DOS下文件名有长度限制。
L 加载文件
通常,当你想“调试”一个文件时,你会用这样的命令启动debug: C:\WINDOWS>debug test.com。但是也可以通过使用’N’命令,然后使用’L’命令(不带参数),从DEBUG本身将文件加载到DEBUG的内存中,像这样:
C:\>debug
-n jerry.com
-l
-u

W 保存文件
n 路径\文件名:设置文件名 (不写路径,就是当前目录)a:在CS:0100处开始写汇编指令。r cx:回车然后写入要保存的字节长度。(我们从 0 开始写的,看最后一行地址就行了)

2. 实验任务
1. 使用 Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后 CPU 中相关寄存器中内容的变化。
提示,可用 E 命令和 A 命令以两种方式将指令写入内存。注意用 T 命令执行时CS:IP 的指向。



2. 将下面 3 条指令写入从 2000:0 开始的内存单元中,利用这 3 条指计算 2 的 8次方。
mov ax, 1
add ax, ax
jmp 2000:0003
执行完毕结果 100H = 256
3. 查看内存中的内容
PC 机主板上的 ROM 中写有一个生产日期,在内存 FFF00H~FFFFFH 的某几个单元中请找到这个生产日期并试图改变它。
提示,如果读者对实验的结果感到疑惑,请仔细阅读第 1 章中的 1.15 节。

- 先把 DS 改成
FFF0方便下面查找。 s 0 f "/":在DS:0到DS:F范围内查找/。(没找到。第二次扩大范围到FF)- 找到两处。用
d查看目标位置。
在 FFF0:00F5 处找到一个 01/01/92 也不知道是不是它。

e f5 12 把 FFF0:00F5 处内容改为 12,查看了一下没效果。因为这段内存是只读的。
地址
C0000~FFFFF是只读存储器。
4. 向内存从 B8100H 开始的单元中填写数据
如:-e B810:0000 01 01 02 02 03 03 04 04
请读者先填写不同的数据,观察产生的现象;再改变填写的地址,观察产生的现象。
提示,如果读者对实验的结果感到疑惑,请仔细阅读第 1 章中的 1.15 节。

地址
A0000~BFFFF为显存地址空间
参考资料
A Guide to DEBUG
A Guide to DEBUG (Page Two) A DEBUG Tutorial


















