《汇编语言》- 读书笔记 - 实验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