今天看完第二章,学习了主要的实验:汇编调试,用来查看机器码,汇编语言,以及CS:IP地址之间的关联。

一般我们在查看CS:IP指向的内存,然后在CS:IP指向的内存中写入一定内存的机器码转成汇编或者是直接写入汇编指令。

先来说一下调试实验用的工具:debug.exe.是汇编语言书上说的,但是WINDOWS7及以上的系统削减了debug,导致我们没法在dos命令中直接Debug,我们要获取一个环境

1.安装windows2000server虚拟机

2.这个方法比较简单,就是下载一个dosbox,直接去网上搜,按照默认路径下载,我也附上下载地址:

https://files.cnblogs.com/files/ECJTUACM-873284962/DOSBox0.74-win32-installer.rar

然后下载Debug.exe32位程序,附上下载地址

https://files.cnblogs.com/files/ECJTUACM-873284962/DEBUG.zip

下载好之后,打开dosbox然后输入

1
mount c debug.exe的安装地址

即可完成挂在。然后直接输入 c:

image-20220217230649779

它的意义就是dosbox应该在C盘中执行命令,这里把debug.exe所在文件夹当作C盘,直接可以执行debug.exe

我们打开程序debug

1
-r用来查看各寄存器中的指令。

image-20220217230747653

寄存器中存的是地址,也就是内存的位置,要到内存中去读取具体数据,也就是读取命令,我们用

1
-d来查看具体内存中的数据,指令。

image-20220217230907601

我们并未指定内存地址,所以它随机返回了一组内存单元的内容,我们可以指定:

image-20220217231156106

我们可以用

1
-d 初始地址比如0000:0010

它会自动返回一个长位128Byte的机器码如中间的输出,最右边的输出是机器码转换为ASCII码之后的值。

我们发现右边都是点或者不可见字符转换而来的,应该是相应内存单元没有字符串类指令,如果在机器指令处输入数字,转换成ASCII很容易是不可见的,也就是…点。

刚才说的 r 还能用来改写CS:IP中的指向,也就是改写寄存器中的地址。可以直接执行我们所改地址中的指令。

例如:image-20220217233157791

我们修改了AX寄存器中的内存地址,由0000变为1111,但是CPU执行指令是执行CS:IP中的地址,所以我们可以尝试修改CS:IP

image-20220217233507005

一开始的CS:IP是073F:0100,寄存器里面存的值问0001,

image-20220217233704886

我们修改为段地址不动,段地址就是CS代表的地址,IP为偏移地址,改为0200H

发现修改了指向地址,取出的指令也就不同了。

下面继续来看 -d指令,它还有几种看内存数据的方式

1
d 1000:9

image-20220217234217319

也就是起始偏移地址从9开始,如图中间的机器码是第九位,也就是从中间开始,然后输出128 Byte结束。

或者可以先给出初始地址,然后给出结尾地址,直接可以打印出之间的所有内存

但是注意格式

1
-d 1000:0000 0009

最后面的就只写偏移地址,也就是说最多从0000打印到ffff也就是多少位?

也就是hex(10000)位即16……4 = 65536个内存。

下面用E来改写

第一种方法,直接对应地址写入数据

image-20220217235431469

我们看到按照地址次序成功被写入内存,称为十六进制机器码。

第二种方法,先进入这个地址,然后用提问的方式,一个一个写:

image-20220217235820134

在点后面输入添加的内容。

image-20220217235902244

输入完一个内存的数据就敲space最后都输入完回车即可。

如果键入字符串,会把字符串转换为ASC码放到内存中当作机器码:

image-20220218000211449

注意我犯了错误,是键入字符串,要用单引号包裹,如果键入字母,一样会被直接写入机器码。image-20220218000416950

特别注意必须要用第一种键入方式,一次性都键入再执行,因为第二种方式键入时不能打引号,无法形成字符串。

image-20220218000501342

确实将ASC码放入机器码中,在右边的 ASCII码输出中输出了字符!

下面我们写入特定的机器码,能让其翻译成成句的汇编语句。

image-20220218000647594

image-20220218000737147

如何看翻译出来的汇编结果呢,需要参数U

image-20220218000831253

成功翻译成了我们想要的指令!

如何来执行呢?用新的参数T

应该先让R修改CS:IP到我们添加指令的地址!

image-20220218001101711

成功执行了 mov ax,0001后面显示的 MOV CX,0002代表IP +3之后的指令

image-20220218001209735

如图,此时IP正好位0013.

image-20220218001251421

再次执行后看到IP变成0016,指向最后一条ADD指令。

下面提供直接写入汇编指令的方式,比先用E写入机器码再用U转码要容易

用A指令

image-20220218001608890

如图键入即可。

image-20220218001658547

下面看一个实验练习:

image-20220218002221718

我们敲在编译器中,先用A写入内存,再用R查看到CS:IP的地址,逐条执行。

image-20220218002337788

可以看到AX,BX的值确实按照预期变化。

下面做最后一个练习:利用如下指令计算2的3次方:

1
2
3
mov ax,1
add ax,ax
jmp 1000:0053

image-20220218002955814

image-20220218003030028

看图我就不多说啦,迭代两次很容易理解!