当前位置 : 主页 > 编程语言 > 其它开发 >

汇编(微机系统上机学习)基于DOSbox实现DEbug

来源:互联网 收集:自由互联 发布时间:2022-05-30
# 微机系统上机实验学习笔记## 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 寄存器包含正确的值。
网友评论