标签:地址 红色 显示 两种 bubuko 单步调试 exe 字符 ESS
四、实验结论
1. 练习1
第一步,在记事本中输入实验要求中提供的代码,结果如下:
将其以文件名t1.asm另存为到E:/masm。
第2步,为方便后续操作,此处先准备一个批处理文件:
同样将其放入E盘masm路径下,重命名为process.bat。
(1)进入并配置好DSBox环境,使用process t1对t1.asm进行编译、连接并运行:
屏幕上出现36.
(2)将修改line 4和line 6中寄存器dl增加的值,发现line 4中写入的数值是屏幕上显示的第一位数字1,line 9中的数值是屏幕上第二位数字。
(3)使用debug命令对生成的t1.exe进行调试。
①首先,使用r命令查看寄存器的值:
注意到,此处CX的值是0016H,DS的值为075AH,CS的值为076AH,刚好满足CS=DS+10H。
②使用d命令查看程序段前缀的前两个字节,发现前两个字节的确是CD 20:
3.反汇编t1.exe,查看所得代码,由于CX=0016H,所以此处我们查看从CS开始的0015H个字节的代码:
刚好是t1.asm中的内容。
④使用t命令和p命令进行单步调试直至程序结束,观察结果:
2. 练习2
第一步,编写汇编源程序:
第二步,
(1)对源程序进行编译、连接、运行,运行结果如下:
看到屏幕出现酒红色的36,嗯,这说明我们的程序有好好的编译连接和运行了……
(等等,说好的err呢?
)
(2)好吧,我们进继续按照实验要求中将原代码line 7的0433H改为0432H,将line 10中毒的0436H改为0439H,重新进行编译、链接、运行,得到结果如图:
(3)我们继续尝试修改填入显存单元中的数值,将源代码中line7的0433h改为0333h, line10 的 0436h改为0336h, 然后重新汇编、连接,并运行,结果如下:
此时屏幕左上角出现了绿色的36。
3. 延伸思考与分析
(1)在实验一中,我们已知地址A0000~BFFFF被用来当做显存地址空间,向地址为A0000~BFFFF的内存单元中写入数据,就是向显存中写入数据,这些数据会被显示卡输出到显示器上。在练习2中,line 7和line 10实际上即是在向段地址为B800H,偏移地址为BX的内存单元中写入数据,所以会被直接显示在屏幕的对应位置。而且,注意到显示的数字的ASCII码正好为写入的数据第二个字节。同时我们也看到,屏幕上打印的文字的颜色随着第一个字节的改变而改变。
(2)练习2中打印字符的原理参见上问,此处不再赘述。在练习1中是通过系统功能调用来显示数值,并且我们观察到,INT 21H所实现的功能随寄存器AH中的值不同而不同,当AH=02H时,所实现的功能是显示字符,并且显示的字符所对应的ASCII码正好是寄存器DL中的数据。
五、总结与体会
通过实践两种不同的方式在显示器上打印字符,学习了完整汇编源程序编写→汇编→连接→运行→调试的方法,加深了对之前所学知识的理解,掌握了通过寄存器BX实现间接寻址。
标签:地址 红色 显示 两种 bubuko 单步调试 exe 字符 ESS
原文地址:https://www.cnblogs.com/AlexanderYang/p/9979260.html