实验2 汇编源程序编写与汇编调试
Posted wwangzz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验2 汇编源程序编写与汇编调试相关的知识,希望对你有一定的参考价值。
一、实验目的
二、实验准备
三、实验结论
首先用edit编辑ex1.asm文件:
然后使用masm命令进行汇编(没有打;所以要多打几个回车):
使用link进行连接,得到可执行文件:
查看生成文件:
运行ex1.exe,看到输出了4个图案:
接下来使用debug命令调试,首先查看到CX寄存器的值为0031,说明机器码有48个字节,所以使用u命令对076A:0000 0030进行反汇编(一般字节数为CX-1)。
从上面可以看到DS=075A ,CS=076A=DS+10H,而这中间的10H(256字节)就是PSP,是DOS用来和程序进行通信的。所以ds:0 ff中间的内容就是PSP,而CS:0指向程序的第一条指令。DS存放的是程序段地址,由于PSP的存在,真正要执行的地址是DS再加上256个字节,真正的地址是DS*16+256化简一下:DS*16+0+16*16=16*(DS+16)真正的地址又可以写成:cs*16+0.
下面就使用-d ds:0 ff来进行查看,以CD开头,证明是PSP。
使用g命令调试,首先使用g命令到mov AH,4C之前,然后用t单步调试,最后使用p调试int 21,结束程序.
首先用edit编辑ex2.asm文件:
然后使用masm命令进行汇编,使用link进行连接,得到可执行文件,并且执行文件,显示出符号:
接下来使用debug命令调试,首先查看到CX寄存器的值为001C,说明机器码有001Bh个字节。
所以使用u命令对076A:0000 001B进行反汇编(一般字节数为CX-1)。
用g命令调试,首先使用g命令到mov AH,4C之前,然后用t单步调试,最后使用p调试int 21,结束程序.
一开始调试根本没有显示图标,应该是和屏幕的滚动有关系,cls后单独进行执行就有结果了,下面将mov cx, 4 改成 mov cx, 8后的显示因为多反汇编了一步导致在单步调试的时候屏幕发生滚动,导致小图标的消失.
将ex2.asm中的mov cx, 4 改成 mov cx, 8;然后后重新编译,链接,生成可执行文件并运行:
明显看出来这次运行出来的小图标有8个,比修改前多了4个,而这正好对应着loop多循环了4次后,将增加了0101H的AX放入到下一个内容单元.
总结:ex1和ex2,他们实现的功能是相同的,都是将0101H的倍数(依次递增)存入到DS(B810H),因为是修改的显存的内容,所以会在屏幕上显示出图案;在具体实现上,ex1是直接寻址方式,ex2是间接寻址方式.
根据实验结果,分析得到这个字数据中高位字节里存放的是颜色,低位字节里存放的是字符ASCLL码,37H是7 39H是9。
编译之后使用debug查看各种寄存器的状态,并且使用u精准反汇编得到结果如下:
使用g命令直接完成循环,然后使用d 0:200 23F命令查看内容,存储内容正确,然后完成调试.
使用u命令精准反汇编:
g命令调试到loop s之前:
p命令调试:
分别查看0:200内存里面存储的和指令内容,验证是一样的,赋值成功.
实验总结
(1)能够熟练掌握出使用masm、link工具汇编、链接的命令行并查看运行结果的方法。
(2)了解t命令 p命令和g命令的使用区别。t命令是单步调试,p命令是遇到loop指令执行到loop指令结束的位置,g命令是执行到指定的行位置,我是习惯使用g命令直接到mov ax,4c00h之前然后再t命令和p命令来结束调试。
(3)关于实验1和2,在调试过程中没有显示,个人觉得应该是和屏幕滚动有关,当行数不足以滚动屏幕时,继续t命令,小图标是不会消失的,但是当屏幕滚动时,小图标就消失了。
以上是关于实验2 汇编源程序编写与汇编调试的主要内容,如果未能解决你的问题,请参考以下文章