本博文系列参考自<<汇编语言>>第三版,作者:王爽
Dubug是dos,windows下提供的调试工具,使用该工具,可以查看和修改寄存器,内存的内容。同时可以在机器码级别跟踪程序源码的运行。
1.常用的debug功能
(1)用Debug的R命令查看、改变CPU寄存器内容;
(2)用Debug的D命令查看内存中的内容;
(3)用Debug的E命令查看内存中的内容;
(4)用Debug的U命令将内存中机器指令翻译成汇编指令;
(5)用Debug的T命令执行一条机器指令;
(6)用Debug的A命令以汇编指令的格式在内存中写入一条机器指令;
2.进入debug工具
在开始中输入cmd,打开Dos命令行窗口,在命令行窗口输入debug即进入了debug工具。如下图所示:
3.R命令查看和改变寄存器内容
在debug工具中输入R命令,注意debug工具的命令不区分大小写,命令结果如图所示:
这里列出了CPU中所有寄存器的内容包括:AX,BX,CX,DX等,另外NV,VP,EI,PL等为标志寄存器,暂时不予理会。这里我们可以看到CS=1442H,IP=0100H,所以CPU即将执行指令的地址为1442:0100,另外在CS:IP地址后面还给出了即将执行指令的机器码为0000H,其对应的汇编指令为 ADD [BX+SI],AL
R指令还可以改变寄存器中的内容,改变方式为R 寄存器名字比如我们发现寄存器BX的值为0000H,我们要将其改变为0100H,那么具体操作如下图所示:
4.D命令查看内存的内容
D命令查看内容的基本格式为:D 段地址:偏移地址 比如我们要查看内存为1000:0的内容,那么可以用如下操作,注意一次性可列出以1000:0位起始位置的128字节的内容
一共显示了8行,每行16个字节,左边为内存地址范围,中间为每个内存的内容(16进制表示),右边为对应的ASCII,不可显示的ASCII字符用.代替。注意我们每次看到的同一段内存的内容也许不一样,因为系统始终在运行,maybe我们查看的内存部分在查看后刚好又发生了改变。默认情况下进入Dubug工具中输入D命令会显示Debug默认内存地址的内容。
当需要查看指定内存区间的内容时可用使用表达式D 段地址:起始偏移地址 结束偏移地址 比如我要查看1000:0-1000:9这段内存地址的内容,那么可以表达成 D 1000:0 9 如下图所示:
如果我们只是想查看1000:0这一个内存地址的内容 可以表达成D 1000:0 0 实验结果如下:
4.E命令修改内存的内容
可以使用E命令改变内存中的内容,比如我想把1000:0-1000:9单元中的内容改为0,1,2,3,4,5,6,7,8,9 其格式为:
E 段地址:起始偏移地址 数据1 数据2.........
一个一个修改内存内容,直接输出E 段地址:偏移地址 然后通过空格一个一个修改,按enter完成修改:
也可通过E向内存写入字符:
其中'a' 'b' 'c'的ASCII码为 61 62 63
写入字符串:
5.E命令写入机器码,U命令将机器码转换为对应的汇编指令
写入机器码,比如下面的汇编指令对应的机器码:
机器码对应的汇编指令
b80100mov ax,0001
b90200mov cx,0002
01c8add ax,cx
实验结果如下如下:
不难看出U命令包括三个部分 左边为内存地址,其次为机器码 最右边机器码对应的汇编指令。
若要执行我们写入的命令,那么应该用到命令T,查看当前寄存器的值:
当前CS与IP的值分别为:CS=1442 IP=0100 要使得计算机执行我们写入的1000:0命令,需要将当前CS与IP改为CS=1000 IP=0000
此时不难看出CS:IP指向我们当前执行的指令。要想执行当前指令我们输入命令T
CS:IP指向mov cx,0002这条指令。
8 用命令A以汇编形式向内存中写入机器指令
之前我们已经用过可以使用命令E直接改写内存,但是这种方式不方便,这里我们使用汇编语言直接向内存中写入机器指令,如下图所示:
可以看到我们通过汇编形式写入的汇编指令,计算机已经翻译成了机器指令。
OK,debug工具的介绍教程已经到此结束,这虽然只是一个粗略的教程,但是工具的熟悉是要在我们日常使用中慢慢熟悉,so,学而时习之,共勉。