debug概述
debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具。使用他可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行
debug的功能
调试(Debug)的命令比较多,共有20多个,但这6个命令是和汇编学习密切相关的。
在以后的实验中,我们还会用到一个P命令。
- R命令:查看、改变CPU寄存器的内容
- D命令:查看内存中的内容
- E命令:改写内存中的内容
- U命令:将内存中的机器指令翻译成汇编指令
- T命令:执行一条机器指令
- A命令:以汇编指令的格式在内存中写入一条机器指令
进入debug模式
R命令:查看、改变CPU寄存器的内容
-
查看CPU寄存器的内容
输入一个r后回车
-
改变CPU寄存器的内容
若要修改一个寄存器中的值,比如AX中的值,可用R命令后加寄存器名来进行,输入“r ax”后回车,将出现“:”作为输入提示,在后面输入要写入的数据后回车,即完成了对 AX中内容的修改。若想看一下修改的结果,可再用R命令查看,如图
D命令:查看内存中的内容
内存中数据的地址由段地址和偏移地址组成,其中段地址乘以16再加上偏移地址就是真实的物理地址
说白了,就是用两个16位数(一个是段地址,另一个是段内偏移),合成一个20位地址
以十进制举例:
假设一本书有99页,如果可以用“2位”十进制数表示,那么第0页就是:00,第14页就是:14.
用2个“1位”十进制数表示那么就只好分段了,由于“1位”十进制数可以表示10页,99页书就分成10段。
则第0页就是:第0段,第0页; 段寄存器为0,段内偏移为0.(即第0段的第0个位置)
第14页就是:第1段,第4页。 段寄存器为1,段内偏移为4.(即第1段的第4个位置)
然后用段寄存器地址和段内偏移地址组成一个“2位”地址。
则第14页物理地址为:段地址“1”左移一位,得到10,再加上段内偏移4,最终得到14.当前编程环境的寄存器是16位的,所以如果不分段的话是无法存下大于16位的地址的。
段地址和偏移地址都是16进制数,所以段地址需要乘以16(与上面十进制书页的例子一样)再加上偏移地址就是物理地址了
-
查看指定地址及该地址后的128个字节数据
查看地址:e291:32f3及后128位字节的数据
-
查看指定范围的地址(不可跨段)
查看地址:0000:0002到地址:0000:0004之间的数据
-
自动地址偏移
-
只输入一个d命令时,不会查看之前的地址的数据,而是会再原有的基础上往后查看128个字节的数据
-
注意,如果要跨段的话会回到段首
-
E命令:改写内存中的内容
-
第一种修改方式
e+起始地址+要修改的值(可以连续写多个)
-
第二种
e+起始地址
如图所示,回车后显示的是地址[0000:0000]的值:00,直接输入要修改的值即可。如果还有修改下一个地址的值则按空格。如果要跳过某个字节不修改直接空格即可
A命令:以汇编指令的格式在内存中写入一条机器指令
在地址:[073f:0100]写入汇编指令,连续按两下回车退出
T命令:执行一条机器指令
输入一个t命令就回车时,默认执行[CS:IP]地址内的指令
t[起始地址]这种格式可以执行指定地址的指令
每执行一次T命令只会执行一条指令
U命令:将内存中的机器指令翻译成汇编指令
将刚刚写入地址[073f:0100]的机器指令翻译成汇编