Debug

是什么?

Debug是DOS、Windows都提供的实模拟程序的调试工具。使用它,可以查看CPU各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行

Debug功能

(1)用Debug的R命令查看、改变CPU寄存器的内容
(2)用Debug的D命令查看内存;
(3)用Debug的E命令改写内存中的内存;
(4)用Debug的U命令将内存中的机器指令翻译成汇编指令;
(5)用Debug的T命令执行一条机器指令;
(6)用Debug的A命令以汇编指令的格式在内存中写入一条机器指令;

进入Debug

(1)在上一篇中讲到用DOSBox进入Debug的调试
在这里插入图片描述
(2)第二种方式在windows2000中进入Debug
选择 **“开始”**的菜单中“运行”命令,打开“运行”命令,输入“command”后,输入“Debug”

用R命令查看、改变CPU寄存器的内容

在这里插入图片描述

从图中我们可以看到AX、BX、CX、DX、CS、IP这个6个寄存器中的内容,图中还有SP、BP、SI、DS、ES、SS、标志寄存器等

用R命令直接修改CS和IP的寄存器中的值试试
在这里插入图片描述
注意
这里输入时不要输入空格否则就会报错,原因就是你给里面多存储了一个空格,但这是不行的

用D命令查看内存中的内容

用”d 段地址:偏移地址“的格式来查看

这里我们查看一下21000H处的内容
在这里插入图片描述
分析一下这个图
从指定地址开始输出128个内存单元的内容
这因为我没有存储数据,所以导致每个内存单元中的数据都是00,
2000:1000的内容为00
2000:1001的内容位00

所以右边表示的全部是点
而如果我们写入数据,就会将数字对应成ASCLL码字符,那么再右边就会显示出对应的字符
在这里插入图片描述

可以看到我将2000:1000 中内存单元改为了72,在ASCLL码中就对应的是小写的r
2000:1001内存单元为64对应的ASCLL码为d

当然这里存储的数据记住是十六进制,这一点对于初学的来说,容易忽略

那如果我们输入d 2000:1002会发生什么?
在这里插入图片描述
可以看到直接从2000:1002单元后的内存开始显示,并且输出到了2000:1082
除此之外
在这里插入图片描述

在使用”d 段地址:偏移地址“之后,接着使用D命令,可列出后续的内容,还是显示128个内存单元的内容

如果我们输入d 2000:1000 1010会发生什么?
在这里插入图片描述
这就表示1000代表显示的起始位置,1010代表最尾100
那如果我们之查看单个内容

在这里插入图片描述

用Debug的E命令改写内容

在介绍Debug中的d命令时,就是用的E命令输入的内容
对于E命令我们可以用“e 起始地址 数据 数据 数据…”这样的方式进行输入

在这里插入图片描述
当然我们也可一个一个的改写内容

在这里插入图片描述

如图
(1)输入e 1000:10按enter
(2)Debug显示起始地址2000:1000,和原始内容:6D然后光标停在“.”上
此时有两个选择:
一.输入数据,空格接着又会显示下一个数据又会出现一个”.“输入数据,最后回车改写数据
二.直接空格,表示不改写这个数据,将显示下一个数据的内容

E命令还可以输入字符
在这里插入图片描述

用E命令向内存中写入机器码,用U命令查看内存中机器码的含义,用T命令执行内存中的机器码

机器码也是数据
如果我们要像内存2000:1000单元写入

机器码对应的汇编指令
b80100mov ax,0001
b90200mov cx,000e2
01c8add ax,bx

在这里插入图片描述

如图我们分析一下U命令
2000:1000 处存放的机器码是b8 01 00 对应的汇编指令是mov ax,1
从这里我们可以理解到,对于数据可以当做指令来看待,怎样的使用数据却决于程序员

如何执行机器指令?
第一步我们先查看一下cs 和 ip 所指向的地方
在这里插入图片描述
现在CS=2000,IP=1000,刚好指向我们所写机器指令的位置,所以就不需要修改了,但如果不是就需要用r命令
或者jmp命令进行修改,而如果直接用mov命令是不可以的,会报错
直接执行一下
在这里插入图片描述
分析上图,
我们看到mov指令是3个字节,ip+3(还是十六进制)
add命令两个字节
需要注意

cs和ip
CS和IP是8086CPU中最关键的两个寄存器,CS为代码段寄存器,IP为指令指针寄存器,由前面我所学的物理地址之到,8086CPU将从cs的内容X16+ip的内容开始执行
CPU将CS:IP指向的内容当作指令执行

用Debug的A命令以汇编指令的形式在内存中写入机器指令

除了用E命令写入数据,再用U命令转换为汇编指令外,我们还有一种方式直接写入汇编指令
就是A命令
如图试着写入A命令
在这里插入图片描述
再结合我们所学知识,如何执行该命令?
首先我们要先改一下cs和ip的指向
再进行如下的操作
在这里插入图片描述
在这里插入图片描述

Jmp命令
若想同时修改CS和IP的内容,可用形如”jmp段地址:偏移地址“的指令完成
注意
jmp命令是执行的命令,也就是说mov 和add sub等指令是一样的
这里我理解的时候当成了类似于d e t r 等命令去操作,导致一直报错
现在我们接着上面,将CS和IP的值跳转到2000:1000上
在这里插入图片描述
用A命令将jmp指令写入,我们看到就跳转到了2000:1000上从而可以执行该代码段的内容
也就是说jmp汇编指令可以帮助我们实现循环

除此之外,若只想修改IP的内容,”jmp某一合法寄存器“的指令完成
jmp ax, 指令执行前:ax=1000,cs=2000,ip=0003
指令执行后:ax=1000,cs=2000,ip=1000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Back~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值