预备知识:Debug的使用
1.Debug:
Debug时DOS、Windows都提供的实模式(8086 方式)程序的调试工具。
debug是Windows 16位或者32位机器上的一款调试工具。
也就是说,在WindowsXP及以前的机器上都有debug,直接Win+X debug就可以调出;
在之后的32位机也有;但是在之后的64位机器上不存在,即使有,也无法运行。
相似的,微软的masm也无法在64位版本的系统上运行。
可以通过安装dosbox来虚拟一个DOS环境或者使用WindowsXP(虚拟机即可)的方式来使用debug和masm。
原文链接:https://blog.csdn.net/Apheal/article/details/80617302
使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。
R命令:查看、改变CPU寄存器的内容
D命令:查看内存中的内容
E命令:改写内存中的内容
U命令:将内存中的机器指令翻译成汇编指令
T命令:执行一条机器指令
A命令:以汇编指令的格式在内存中写入一条机器指令
2.进入Debug
Debug是在DOS方式下使用的程序
步骤:win+R——cmd——debug
由于64位的 Windows 11 系统无法直接使用 16 位的 Debug 工具
因为它只支持 32 位和 64 位程序,这里选择开个虚拟机进行实验。(win2003_server)
注意CS和IP的值,CS=0AF0,IP=0100
也就是说,内存0AF0:0100处的指令为CPU当前要读取、执行的指令。
Debug还列出了CS:IP所指向的内存单元处存放的机器码,并将它翻译为汇编指令。
可以看到,CS:IP 所指向的内存单元为0AF0:0100,
此处存放的机器码为74E4
对应的汇编指令为JZ 00E6
3.r命令
还可以用Debug修改寄存器中的值:
如AX中的值,输入“r ax”将出现“:”作为输入提示。
此时寄存器AX中的值被改成了:1111
4.d命令
使用Debug的D命令,可以查看内存中的内容,D命令的格式较多。这里只用一部分。
eg:想知道内存10000H处的内容:"d 段地址:偏移地址“
使用D命令,Debug将输出3部分的内容:
1.中间是从指定地址开始128个内存单元的内容,用十六进制的格式输出,每行的输出从16的整数倍的地址开始,最多输出16个单元的内容。
2.左边是每行的起始地址
3.右边是每个内存单元的数据中对应的可显示的ASCII码字符,如果没有,就用”.“代替。
其他:
接着使用d命令——列出后续内容
也可以指定D命令查看范围——d 段地址:起始偏移地址 结尾偏移地址
eg:要查看1000:0~1000:9中内容——d 1000:0 9
5.E命令
可以使用E命令来改写内存中的内容,
格式:”e 起始地址 数据 数据 ……“的格式来进行。
6.U命令
查看写入的或内存中原有的机器码所对应的汇编指令。
比如U命令将从1000:0开始的内存单元中的内容翻译为汇编指令,并显示。
由此,我们再一次看到内存中的数据和代码没有任何区别,关键在于如何解释。
7.T命令
执行一条或多条指令,简单地使用T命令,可以执行CS:IP指向的指令。
8.A命令
前面曾使用E命令写入机器指令,这样做很不方便。
A命令可以直接以汇编指令的形式写入指令。
如图以汇编语言向从1000:0开始的内存单元中写入了几条指令,然后用D命令查看A命令执行的结果。可以看到,Debug已经将这些汇编指令翻译为对应的机器指令你个,将它们的机器码写入内存。
小结:本次实验中用到的命令
查看、修改CPU中寄存器的内容:R命令
查看内存中的内容:D命令
修改内存中的那日容:E命令
将内存中的内容解释为机器指令和对应的汇编命令:U命令
执行CS:IP指向的内存单元处的指令:T命令
以汇编指令的形式向内存中写入指令:A命令
实验任务:
1.使用Debug,将一段程序写入内存
2.利用指令计算2的八次方
3.查看内存中的内容,尝试修改主板ROM中的生产日期
4.