实验一 Debug工具的使用
1)、什么是Debug?
实模式( 8086 方式)程序的调试工具。可以用它查看 CPU 各种寄存器中的内容、内存的情况和在机器码级跟踪程序的运行。还可以满足你作为Hentai的偷窥欲望,想想透过这个小小的dos窗口CPU和RAM在你面前一览无余的样子,是不是一下子就冲…满了热情呢 (并没有)
2)、我们用到的Debug功能
-
用 Debug 的 R 命令查看、改变CPU寄存器的内容。
-
用 Debug 的 D 命令查看内存中的内容。
-
用 Debug 的 E 命令改写内存中的内容。
-
用 Debug 的 U 命令将内存中的机器指令翻译成汇编指令。
-
用 Debug 的 T 命令执行一条机器指令。
-
用 Debug 的 A 命令以汇编指令的格式在内存中写入一条机器指令。
3)、进入Debug
在运行输入框输入**“command”** (不是cmd),打开cmd窗口后,输入**“debug”**。
(这个功能在win10不能直接用,当然也不推荐在自己的电脑上直接用,哪次要是不小心改了个重要寄存器的参数,电脑就gg了,建议使用 win xp 或 win7 的虚拟机)
debug.exe一般在c:\winnt\system目录下,但是由于系统配置了系统路径,所以在任何一个路径下都可以运行。
4)、用 R 命令查看、改变 CPU 寄存器的内容
debug程序提供了多种指令来访问或改变寄存器的值,其中,R 命令的作用为查看、改变 CPU 各寄存器中储存的值。
输入 R 命令,CPU 所有寄存器的值将会被输出到窗口中。
还可以用 R 命令来改变寄存器中的内容。
输入 “r 寄存器的编号” 后按 Enter 键,将出现 “ : ” 作为输入提示,输入要写入的数据后按 Enter 键即完成修改,若需确认修改的结果,可再用 R 命令查看。此处以 AX、CS、IP 寄存器为例,其他寄存器同理。
5)、用 Debug 的 D 命令查看内存中的内容
用 Debug 的 D 命令,可以查看内存中的内容,D 命令的格式较多,此处只介绍在本次实验中使用的格式。
输入d指令可以查看Debug默认位置的内存内容:
如果要查看内存 10000(H) 中的内容,首先将这个内存地址表示为 “段地址:偏移地址” 的格式,如 “1000:0”,然后输入 “d 1000:0” 列出 1000:0 处的内容。
此处输出的内存内容具体分为3部分
-
**从指定地址开始的128个内存单元的内容:**就是中间的主体部分,用十六进制的数字表示,没看的输出从16的整数倍的地址开始,最多输出16个单元的内容。为了便于阅读,每行的中间有一个 “ - ” 符号,将每行的输出分为两部分
-
**每行的起始地址:**就是输出的左边部分,同样以 “段地址:偏移地址” 的格式显示
-
**内存单元中的数据对应的可显示的ASCII字符:**右边的字符串就是内存单元数据对应的ASCII字符,如果没有对应的可显示的ASCII字符,则用 “ . ” 代替。
如果用 “d 1000:9” 查看1000:9处的内容,Debug输出如下:
在使用 “d 段地址:偏移地址” 指令后,接着使用d命令,可列出后续的内容。
也可以指定 D 命令的查看范围,此时采用 “d 段地址:起始偏移地址 结尾偏移地址” 的格式。比如要查看 1000:0~1000:f中的内容,可以用 “d 1000:0 f ” 实现。
如果只想查看某一内存单元比如说 10000(H) 中的内容,可以用以下任一种方法达到目的:
6)、用 Debug 的 E 命令改写内存中的内容
可以使用 E 命令来改写内存中的内容,使用 “e 起始地址 数据 数据 数据…” 格式来达到目标,数据可以是 16 进制数字,也可以是字符。
不要什么奇怪的东西都塞到内存里啊混蛋
也可以逐个修改内存单元的内容,以从 1000 : 10 单元开始为例,步骤如下:
- 输入 e 1000:10, 按 Enter键。
- Debug 显示起始地址 1000:0010,和第一单元(1000:0010单元)的原始内容:6 D,然后光标停在 “ : ” 后面提示输入想要输入的数据,输入数据后按空格键表示修改完成(若无输入数据即按下空格,默认不修改数据)。
- 当前单元输入完成后,Debug 将显示下一个内存单元的内容,可以依次修改。
- 当所有需修改的内存单元修改完毕后,按下 Enter 键,E 命令操作结束。
7)、用 E 命令写入机器码,U 命令查看含义,T 命令执行
用e指令写入十六进制的机器码(其实和写入数据是一模一样的操作,从这里我们也可以看出来,数据与指令其实在内存里的储存形式是一样的,只有把这些十六进制数字放进CPU中时,才体现出区别。)
写入机器码指令后想要执行怎么办?
需要让CS、IP两个寄存器指向我们刚写入的内存空间,只有这样,才能让CPU把我们输入的数据解释为机器指令
所以,需要用 R 命令修改CS、IP中的内容,然后使用 T 命令执行我们写入的指令。注意:指令执行后,IP 的值自增了 3,因为刚刚我们执行的指令长 3 个字节。使得 CS:IP 指向下一条指令
8)、用 A 命令以汇编指令的格式在内存中写入机器指令
使用 A 命令写入汇编指令时,在给出的的起始地址后直接按 Enter 键表示操作结束。
同样可以通过 R 命令与 T 命令配合执行所写入的汇编指令。
强行总结,汇编学得好,牢饭吃到饱(doge)