Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用它可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。
| 命令 | 功能 |
|---|---|
| R命令 | 查看、改变CPU寄存器的内容 |
| D命令 | 查看内存中的内容 |
| E命令 | 改写内存中的内容 |
| U命令 | 将内存中的机器指令翻译为汇编指令 |
| T命令 | 执行一条机器指令 |
| A命令 | 以汇编指令的格式在内存中写入一条机器指令 |
Debug是在DOS方式下使用的程序。我们在进入Debug之前,先进入到DOS方式,用以下方式可以进入DOS。
在Windows下进入Debug的方法:
(a) 打开cmd

(b) 由于64位机没有debug,为了使用debug,先输入mount c F:\DOSBox\Masm
之后输入c: 跳转至C盘
后输入debug,即可进入debug


在这里我们可以查看到CS:IP = 07EF:0100 也就是说CPU当前要读取、执行的指令,机器码是00 00,对应的汇编指令为ADD [BX + SI],AL
其他信息之后在进行讲解
还可以使用R命令来改变寄存器中的内容

输入r ax即可修改AX中的内容,想查看修改后的结果可以再用R命令查看
如果我们想知道内存10000H处的内容,可以用d 段地址:偏移地址的格式来查看

使用 d 段地址:偏移地址 的格式,Debug将列出从指定内存单元开始的128个内存单元中的内容
D命令会输出3部分内容:
每行中间有一个“-”,他将每行输出分为两个部分,便于查看,比如要在途中找出1000:6B的内容,可以从1000:60找到行,“-”前面是1000:60 ~ 1000:67的8个单元,后面是1000:68 ~ 1000:6F的8个单元,这样我们就可以从1000:68单元向后数3个单元,找到1000:6B单元。
左边是每行的起始地址
右边是每个内存单元中的数据对应的可显示的ASCII码字符。073F:0、073F:1、073F:2中存放的数据是CD、20、3E,他们对应的ASCII字符分别是. >,没有对应的ASCII字符,在Debug中就用“.”去代替
我们在Debug中看到的是原来就在内存中的内容,这些内容都可能会随时改变,当然我们也可以去改变内存、寄存器中的内容。
使用d 1000:9查看1000:9处的内容

Debug从1000:9开始显示,一直到1000:88,一共是128个字节,第一行中的1000:0~1000:8单元中的内容不显示。
在已进入Debug之后,用D命令直接查看,将列出Debug预设地址处的内容,如图

使用d 段地址:偏移地址之后,可以接着使用D命令列出后续内容

也可以去指定D命令的查看范围,采用d 段地址:偏移地址 结尾偏移地址 的格式,比如要查看1000:0 ~ 1000:9中的内容,可以用d 1000:0 9来实现

如果我们就想查看内存单元10000H中的内容,可以使用如下几种方法:

可以使用E命令来改写内存中的内容,比如将内存1000:0 ~ 1000:9单元中的内容分别改写为0、1、2、3、4、5、6、7、8、9,可以用e 起始地址 数据 数据 ...的格式来进行

也可以一个一个修改

如上图,我们可以用输入地址后,按Enter键,一个一个输入想修改的内容,按空格进行间隔
也可以用E命令向内存单元中写入字符

也可以使用E命令向内存中写入字符串,比如:

那么我们如何向内存中写入机器码呢?机器码也是数据,所以也可以用E命令将机器码写入内存。比如我们要从内存1000:0单元开始写入这样一段机器码:
| 机器码 | 对应汇编指令 |
|---|---|
| b80100 | mov ax, 0001 |
| b90200 | mov cx, 0002 |
| 01c8 | add ax, cx |

但是如何查看写入或是内存中原有的机器码所对应的汇编指令呢?——U命令
比如可以用U命令将从1000:0开始的内存单元中的内容翻译为汇编指令,并显示出来,如图

那么如何去执行我们写入的机器指令呢?用debug的T命令可以执行一条或是多条指令,简单使用T命令,即可执行CS:IP指向的指令

上图所示,我们看到CS:IP指向的地方不是我们想要的地方,所以用r命令修改了CS和IP中的内容,使其指向1000:0
完成上述步骤后,我们就可以去执行T命令了

可以看到执行指令后,AX中的值发生了变化
前面我们使用E命令写入机器指令,这样子做是很不方便的,最好能直接以汇编指令的形式写入指令,因此Debug提供了A命令,A命令使用方法如下图:

在光标闪烁处即可写入指令(按Enter键即可停止输入)

在使用A命令写入指令的时候,我们写入的是汇编指令,Debug将这些汇编指令翻译为对应的机器指令,然后将他们的机器码写入内存

解答过程:


mov ax, 1
add ax, ax
jmp 2000:0003


PC机主板上的ROM中写有一个生产日期,在内存FFF00H ~ FFFFFH的某几个单元中,请找到这个生产日期并试图改变它


这里会发现修改不了ROM日期,ROM是只读存储器,只能读出无法写入信息。信息一旦写入后就固定下来,即使切断电源,信息也不会丢失。