# 微机系统上机实验学习笔记## DEBUG指令学习1. 汇编命令(Assemble) 用途:键入汇编指令,并把它们汇编成机器代码,相继存放在从指定地址开始的存储区中。 ==格式:A[address]== 说明:输入给本
# 微机系统上机实验学习笔记
## DEBUG指令学习
1. 汇编命令(Assemble) 用途:键入汇编指令,并把它们汇编成机器代码,相继存放在从指定地址开始的存储区中。 ==格式:A[address]==
说明:输入给本命令的所有数字都是十六进制的。将输入的指令从指定的地址 address 开始 装入内存的连续单元。如果不指定地址,则把语句装入 CS:0100 确定的区域中;如果已用过 A 命令,那么就在前一个 A 命令所装入的最后一条指令的后继单元中,接着输入指令。当所有要求 的指令已输入完成,在提示继续输入下一条指令时,直接按 ENTER 就退回 DEBUG 提示符下。
DEBUG 对不可用语句的响应是显示信息: ∧
error
并显示当前的装入地址。
例如:
C>debug
a200
08B4:0200 xor ax,ax
08B4:0202 mov [bx],ax
08B4:0204 ret 08B4:0205
![](http://img.558idc.com/uploadfile/allimg/boke/2852472-20220428215615985-805011728.png)
--------
2. 比较命令(Compare)
用途:比较存储器中两个数据块的内容。
格式:C range address
说明:比较存储器两个数据块的内容,range 给出第一个数据块的首址及长度,address 给出
第二个数据块的首址。如果找到不相等的字节,则用下列形式显示地址和内容:
addr1 byte1 byte2 addr2
此处,前一半(即addr1 byte1)说明range内不相等单元的位置和内容,后面的一半指的是在 address 中找到的不相等的内容和位置。
如果只输入地址的偏移值,则 C 命令认为是 DS 寄存器中的段。例如:
C 100L20 200
把 DS:100 开始的存储器的 32 个字节同从 DS:200 开始的 32 个字节进行比较。
![](http://img.558idc.com/uploadfile/allimg/boke/2852472-20220428215708981-357598995.png)
----------
3. 显示内存命令(Dump) 用途:显示存储器的内容。
格式:D[address]
或者 D[range] 说明:用两个部分来显示内存内容:
⚫ 十六进制部分。用十六进制显示每个字节。
⚫ ASCII部分。把字节显示成ASCII字符。句点“.”表示非显示打印的字符。
按照 40 列系统显示格式,每行在 8 字节边界上开始,并显示出 8 个字节。按照 80 列系统显 示格式,每行在 16 字节边界上开始,并显示出 16 个字节。在第 8 至第 9 字节之间有一个连字符 “—”。
显示内存命令有两种格式可供选用。
形式 1——用于显示 40H 个字节(40 列方式)或 80H 个字节(80 列方式)的内容。 例如:
D address
或者
D
显示的内容从指定的地址或当前的地址开始。 形式 2——用于显示指定地址范围内的内容。 这时应输入命令为:
D range
例如
D CS:100 10C
显示地址从 CS:100 到 10C 范围的内存单元的内容。
![](http://img.558idc.com/uploadfile/allimg/boke/2852472-20220428215807925-1679114433.png)
---------
4. 修改内存命令(Enter) 用途:该命令有两种工作方式:用清单中包含的值替换从指定地址开始的一个或一个以上的
字节内容(参看形式 1);显示和允许顺序方式修改字节(参看形式 2)。
格式:E address (list)
说明:如果只输入偏移值作为地址,那么 E 命令认为是包含在 DS 寄存器内的那个段。 修改内存命令有两种格式供选用:
形式 1——用于把清单的内容存放在指定地址开始的内存中。 命令为
E address list
例如:
E ds:100 F3‘XYZ’8D
用清单中指定的 5 个字节填满 ds:100 到 ds:104 存储单元。 形式 2——用于显示地址和单元的内容,然后系统等待输入。 例如:
E address
现在可以开始下列操作:
- ⚫ 输入一个或两个十六进制值的字符去替换字节的内容,然后采取下面操作之一。
- ⚫ 按空格步进到下个地址,并显示其内容。如果希望改变其内容就采取上述第一条操作。
- ⚫ 输入连字符“—”退回到前一个地址,并显示其内容。如果希望改变其内容则采取上述
第一条操作。
- ⚫ 为了退回一个以上的字节且不改变当前字节,应输入另一个连字符。
- ⚫ 为了结束E命令,按ENTER键。 例如:
E cs:100
可以得到如下显示内容:
04BA:0100 EB._
为了把 04BA:0100 内容由 EBH 改变成 41H,则输入 41:
04BA:0100 EB.41
为了查看下三个单元的内容,按三次空格,屏幕显示出:
04BA:0100 EB.41 10.00.BC._
为了把当前单元(04BA:0103)由 BCH 改成 42H,应输入 42:
04BA:0100 EB.41 10.00.BC.42
如果要退回并把 10H 改成 6FH,则按两次连字符和输入置换的字节之后,屏幕上显示: 04BA:0100 EB.41 10.00.BC.42
04BA:0102 00._
04BA:0101 10.6F
按 ENTER 键结束输入命令,将会看到提示符为连字符“—”。![](http://img.558idc.com/uploadfile/allimg/boke/2852472-20220428215828056-361508006.png)
连续输入四次空格:
![](http://img.558idc.com/uploadfile/allimg/boke/2852472-20220428215844625-574040608.png)
---------
5. 填写命令(Fill)
用途:用清单中的值填写 range 范围内的存储单元。
格式:F range list 说明:如果清单中包含的字节数小于地址范围,则重复地使用该清单,直到把所指定范围内
的存储器单元填满为止。如果清单中包含的字节数大于地址范围,就忽略不计超过的部分。 例如:
F4BA:100 L 5 F3‘XYZ’8D
用指定的 5 个字节填写到内存的 04BA:100 到 04BA:104 单元中。注意,存储清单字符是
ASCII 字符码,因此 100—104 单元中为 F3 58 59 5A 8D。
![](http://img.558idc.com/uploadfile/allimg/boke/2852472-20220428215853860-952038307.png)
---------
6. 执行命令(GO) 用途:执行正在调试的程序。当达到所指定的断点地址处时,就停止执行,并显示寄存器、
标志位以及下一条要执行的指令。
格式:G[=address][address[address∙∙∙]]
说明:如果不采用=address 参数(必须输入=号),就从 CS 和 IP 寄存器内容决定的地址开始
执行程序。如果指定=address,则程序就从 CS:address 处开始执行。 执行命令(GO)有两种形式供选用:
形式 1——在无断点时,利用此形式执行正在调试的程序。 例如:
G[=address]
如果不采用=address 时,在发出 G 命令之前,务必要把 CS:IP 值设置正确。 形式 2——完成与形式 1 相同的功能,此外还允许在指定的地址上设置断点。 例如:
G[=address]address[address∙∙∙]
此形式使执行停在指定的单元上,因此可以检查系统/程序环境。可以按任一种顺序指定十 个断点。DEBUG 程序在断点地址上用—个中断码 CCH 置换该指令码。在执行时,无论到达哪— 个断点都停止执行,显示寄存器和标志位,并把所有断点地址的内容都恢复成它们原来的指令码。
例如:
G 102 1EF 208
从当前的指令开始执行,当前指令的地址是 CS:IP 的当前值。没有使用=address 参数。指定
了三个断点,假设到达第二个断点,指令执行到 CS:1EF 单元之前停止执行,恢复原来的指令码, 取消所有三个断点,产生显示并结束 GO 命令。
> 以下为我的执行过程:
>
> 首先我先写了一个断点程序:
>
> 我先进行了==G=102,1EF ==然后陷入了死循环,经查验得知反编译了102到1EF段的指令:
>
> JZ指令是根据ZF位(PWD标志寄存器的一位)进行跳转的,应该是已经跳转到了0115处,所以程序锁死了。
![](http://img.558idc.com/uploadfile/allimg/boke/2852472-20220428215904225-339053764.png)
> 以下为设置三个断点(事实上只会有第一个执行了断点,然后终止了这行指令)
![](http://img.558idc.com/uploadfile/allimg/boke/2852472-20220428215911838-1696831230.png)
-----
7. 十六进制算术运算命令(Hexarithmetic)
用途:先把两个十六进制的值相加,然后第一个值减去第二个值。在一行上显示和与差。 格式:H value value
例如:
H 0F8
17 07
000F 和 0008 的 16 进制和是 0017,而其差是 0007。
![](http://img.558idc.com/uploadfile/allimg/boke/2852472-20220428215918914-866832200.png)
> 前显示和,后显示差
---
8. 输入命令(Input) 用途:从指定的端口输入并显示(用十六进制)一个字节。 格式:I portaddress
-7-
例如:
I 2F8
6B
显示由 02F8 端口读入的一个十六进制字节数(6BH)。
![](http://img.558idc.com/uploadfile/allimg/boke/2852472-20220428215925248-1237156656.png)
找到了0111H的字节显示:FF
-----------
9. 装入命令(Load)
用途:把文件或绝对盘扇区装入到内存中。
格式:L[address[drive sector sector]]
说明:用单个 Load 命令可装入的最大扇区数是 80H。如果出现读盘错,则 DEBUG 显示出
错信息。
装入命令有两种形式:
形式 1——用于从指定的 drive 驱动器中的盘上装入数据,并把数据存放在存储器中指定的 address 开始的单元中。例如:
L address drive sector sector
从指定的起始相对扇区(第一个 sector)读入数据,并连续地读,直到读到所指定的扇区数
(第二个 sector)为止。 例如:
L 4BA:100 1 OF 6D
从驱动器 B 的盘上装入数据,并把数据存放在以 4BA:100 开始的内存中。从相对扇区 0FH(15),即该软盘的第 16 扇区开始,传送 6DH(109)个连续扇区的数据。 形式 2——用于在没有参数或只用一个地址参数时,装入文件。 例如:
L
或者
L address
当启动 DEBUG 程序时,由指定的 filespec 或使用 N 命令满足此要求。把文件装入在以 CS:100
单元或由 address 指定的单元开始的内存中。该文件按文件说明 filespec 读入。BX 和 CX 寄存器 置成读入的字节数目。
例如:
C>DEBUG —N myprog —L
从默认驱动器的盘上,装入名叫 myprog 的文件,并把它存放在 CS:0100 单元开始的存储 器中。
------------
10. 传送命令(Move)
用途:把 range 指定的内存单元内容,传送到以 address 指定开始的一些单元中。 格式:M range address 说明:源区域的数据仍保持不变,除非由传送命令重写过。
例如:
M CS:100 110 500
把 CS:100 到 CS:110 的 17 个字节的数据,传送到以 DS:500 开始的内存区中。
![](http://img.558idc.com/uploadfile/allimg/boke/2852472-20220428215936024-1689372841.png)
--------
11. 命名命令(Name)
用途:为读写磁盘文件定义文件名。
格式:N filespec[filespec..]
说明:如果在无文件说明时启动 DEBUG,在用 L 命令装入文件之前,必须使用 Name 命令。 例如:
C>DEBUG —N myprog —L
----
12. 输出命令(Output) 用途:把字节发送到指定的端口。
格式:O Portaddress byte
例如:为了把字节值 4F 发送到输出端口 2F8,输入: O 2F8 4F
------
13. 退出命令(Quit)
用途:结束 DEBUG 程序。
格式:Q
说明:Q 命令不保存内存中正工作的文件,需要时可用 Write 命令保存文件。 例如:
一Q
A>
-------
14. 寄存器命令(Register)
```
用途:寄存器命令有三种功能:
```
-9-
⚫ 显示单个寄存器的十六进制内容,并带有修改这些内容的选择。 ⚫ 显示全部寄存器、标志位、以及将被执行的下条指令。
⚫ 显示8个标志位状态,并带有修改它们之中任一个或全部的选择。 格式:R[registename]
使用说明:
其一:显示单个寄存器 有效寄存器是:AX、BX、CX、DX、SP、BP、SI、DI、DS、ES、SS、CS 和 IP。 例如,为了显示 AX 寄存器的内容,可输入:
R AX
系统显示如下:
AX F1E4
:_
现在可以采用下列两个操作中的某一个:
⚫ 按ENTER键保留未修改的内容。
⚫ 输入1—4字符的十六进制值来修改AX寄存器的内容,例如FFFH。
AX F1F4
:FFF_
现在按ENTER键把AX寄存器内容改变成0FFFH。 其二:显示所有的寄存器和标志位 为了显示所有寄存器的内容和标志位(还有下条要执行的指令),输入: R
则系统可能显示如下:
AX=0E00 BX=00FF
SP=039D BP=0000
DS=04BA ES=04BA
IP=011A NV UP DI NG NZ AC PE NC 04BA:01lA CD21 1NT 21
CX=0007 DX=01FF SI=005C DI=0000 SS=04BA CS=04BA
头4行显示寄存器十六进制内容和8个标志位状态。最后一行指出下一条要执行的指 令地址和它的16进制机器码以及反汇编形式,这是当前CS:IP指向的指令。
3显示标志位 有8个标志位,每位用2个字母表示是置“1”状态还是清除状态,详细说明见下表:
表1-1 标志位的符号表示
标志位名称 Set(置位) clear(清除)
| 溢出(是/否) 方向(减/增) 中断(允许/禁止) 符号(负/正) 零 (是/否) 辅助进位(是/否) 奇偶(偶/奇) 进位(是/否) | OV DN EI NG ZR AC PE CY | NV UP DI PL NZ NA PO NC |
| ------------------------------------------------------------ | ----------------------- | ----------------------- |
| | | |
为了显示所有的标志位,输入命令:
RF 如果所有标志位处于置1状态,就显示: OV DN EI NGZR AC PE CY—
------
15. 检索命令(Search)
用途:按照 list 清单中的字符检索 range 范围。
格式:S range list 说明:以显示被查找到的匹配字符所在的地址来指明全部的匹配。显示没有地址的提示符
“—”,表示未找到任何匹配字符。
例如:要想从 CS:100 到 CS:110 地址范围内检索 41H,那么输入: S CS:100 110 41
如果找到两个匹配,则显示也许是:
04BA:0104
04BA:010D
--------
16. 跟踪命令(Trace)
用途:从 CS:IP 或者=address(如果指定的话)单元中的指令开始单步执行一条或多条指令。 这里的=号必须输入。可以用 value 指定跟踪多条指令。每条指令执行后,显示所有寄存器的内容、 标志位的状态以及下一条要执行的指令。
格式:T[=address)[value]
例如,输入命令:
T
如果 IP 寄存器内容为 011A,而该地址指向的指令是 MOV AH,0EH,这可能显示:
AX=0E00 BX=00FF CX=0007 SP=039D BP=0000 SI=005C DS=04BA ES=04BA SS=04BA
DX=01FF D1=0000 CS=04BA
IP=011C
NV UP DI NG NZ NC PE NC - 11 -
04BA:01lC CD21 INT 21
这是执行 011A 中指令之后显示的结果,并且指出下条要执行的指令是 04BA:011C 单元中的 INT 21。
---------
17. ==反汇编指令==
用途:反汇编命令可把内存中的机器码转换成汇编语句,并显示指令的地址、机器码以及汇
编语句。例如:
04BA:0100 206472 04BA:0103 FC CLD
AND [SI+72],AH JBE 016B
04BA:0104 7665
格式:U [address]
或者 U [Range]
反汇编命令有两种选择形式:
形式 1——用于反汇编不带指定地址的指令,或反汇编从指定地址开始的指令 例如:
U
或者 U address
用 40 列显示时,一次把 16 个字节反汇编;用 80 列显示时,一次把 32 个字节反汇编。若给
出地址 address,则从指定的地址开始把指令反汇编。如果不指定地址,则 U 命令认为起始地址 是原先 U 命令反汇编过的最后指令的下一个单元。因此,连续地输入无参数的 U 命令能够对连 续的内存单元进行反汇编,并产生连续的反汇编的显示。如果原先没有输入 U 命令,则起始单元 是由 DEBUG 初始化在代码中的段内偏移值 0100H。
形式 2——用于把指定地址范围内的指令进行反汇编。
例如:
U range 不管系统显示格式如何,把指定地址范围内的所有指令都进行反汇编。 例如,输入命令
U 04ba:0100 108 显示可能是: ·
04BA:0100 04BA:0103 04BA:0104 04BA:0106
206472 AND[SI+72],AH
FC CLD
7665 JBE 016B
207370 AND[BP+DI+70],DH
![](http://img.558idc.com/uploadfile/allimg/boke/2852472-20220428215955876-1597329813.png)
-----
18. 写命令(Write)
\- 12 -
用途:把调试过的信息写到磁盘上。
格式:W[address[drive sector sector]]
说明:用单条写命令可以写的最大扇区数是 80H。如果出现写盘错,DEBUG 就显示出错信
息。
写命令有两种选择形式:
形式 1——用于从指定地址开始把信息写到磁盘上。
例如:
W address drive sector sector
从指定的开始相对扇区(第一个 sector)开始写数据,并且连续写,直到写完所要求的扇区
数(第二个 sector)为止。 例如,命令:
W 1FD 1 100 A
把从 CS:01FD 单元开始的数据写到驱动器 B 的软盘中,由相对扇区 100H(256)开始连续 写 0AH(10)个扇区。
形式 2——允许在没有指定参数或只指定地址参数的情况下使用写命令。 例如:
W
或者 W address
此时,写命令把文件写到磁盘上,把从 CS:100 或由参数 address 指定的单元开始的文件按文 件说明filespec写到磁盘上。此文件的文件说明被格式化在CS:5C文件控制块中。当启动DEBUG 时指定文件说明,或者使用 N 命令,采用这两种方法都可满足这个条件。
另外,必须把寄存器 BX 和 CX 置成被写的字节数目,它们可能已由 DEBUG 或 Load 命令 设置过,也可能被修改过。必须确保 BX 和 CX 寄存器包含正确的值。