实验3实验报告

迟到的实验3实验报告=。=

 

实验结论

练习1

先用记事本编辑汇编源程序并保存

 然后进行编译和链接得到可执行文件(编译和链接时结尾加分号可以跳过一些一般情况下默认的步骤,方便一次性生成目标文件)

 运行

将line4和line9中寄存器dl的值分别修改为6和8

重新汇编链接运行,可以发现运行的结果变成了我们所修改的值

然后我们使用debug对生成的可执行文件t1.exe进行调试,先用r命令查看各寄存器的值,可以发现cx的值为16h,说明可执行文件的机器码长度为16h;我们还发现cs=ds+10h,这里的10h的内容就是PSP(程序段前缀),也就是说程序中最为核心的指令部分从cs:ip指向的内存单元开始(也就是下一条要执行的指令)

然后我们使用d命令查看PSP(程序段前缀)的头两个字节的内容,为CD 20

然后我们使用u命令对该程序进行反汇编,并将反汇编得到的结果与源程序进行对比,我们发现指令部分并没有发生变化,但是源程序中的指令结束后又出现了几条指令,根据目前所学习的知识我还不知道它们的作用,但是根据cx的值我们知道可执行文件的机器码长度为16h,可以推断这几条不知名的指令并不会被该程序执行

接着我们再使用t命令对该程序进行单步调试(遇到int命令时,使用p命令调试,int命令类似于高级语言中的函数,若仍使用t命令调试的话相当于进入了函数内部单步调试,过程较为繁琐,故使用p命令将该函数视为一个小整体单步执行下去)

执行完第一个int 21h后可以发现,屏幕上输出了6,也就是一开始给dl的值

执行完第二个int 21h后,屏幕上输出了8,也就是第二次给dl的值,至此我们可以推断add dl,30h这条指令很有可能是一条输出指令,具体功能应该是在屏幕上输出dl的值

执行完了源程序指令中的最后一条后屏幕上出现了“程序正常终止”,说明我们的程序已经执行完毕。可以发现,之前反汇编得到的指令的最后并没有被执行,同时也可以确认,可执行机器码的长度的的确确和cx的值所一致。

 

练习2

 首先编写源程序

然后对其进行编译,链接,生成可执行文件后用debug进行调试

运行这个程序,有些平台在 dosbox 下运行这个程序时有些问题,如果屏幕左上方没有 输出结果,请运行程序t2.exe前,先输入cls命令清空一下屏幕,然后再执行t2.exe。先用r命令查看寄存器的值,cx的值为18h,说明该程序机器码所占的大小为18h,故我们再使用u命令反汇编cs:0000~cs:0017,输入时段地址省略,根据反汇编的结果,我们发现程序实际执行到cs:0013之前就完成了,故我们再使用g命令执行到cs:0013之前,可以发现,左上角输出了红色的36

然后我们将源代码中的line7的0433h→0432h, line10 的 0436h→0439h

然后编译,链接,用debug调试

由于刚才的调试我们已经知道了用g命令直接运行完0013之前的内容可以得到实验结果,所以直接用g命令调试,因为仅仅是更改了这里的两个数值并不影响所生成机器码的长度,可以看见,左上角输出了红色的29

 

然后我们将源代码中line7的0433h→0333h, line10 的 0436h→0336h

然后编译,链接,用debug调试

接着还是用g命令执行到0013之前的内容,可以看到左上角输出了蓝色的36

通过这个实验我们可以发现,0b800h:0000开始的这一段内存地址空间为显存空间,这里面的内容可以被输出到屏幕上,

而line 7和line9就是将要输出的具体内容存入显存了,根据实验结果我们可以得出,输出的数值即使后两位数的ASCII转码,如33→“3”,而前两位则是控制输出的颜色。

 

实验结论

通过这次的实验,我熟悉了如何把汇编源程序通过编译,链接后生成可执行文件,并且掌握了通过debug工具调试自己编写的汇编程序,真正实现了自己的第一个汇编程序的从无到有,收获良多。

 

posted @ 2018-11-28 21:27  曙光女神之宽恕  阅读(198)  评论(0编辑  收藏  举报