实验2 汇编源程序编写与汇编、调试

目录


 

  • 实验结论
  • 实验总结

一、实验结论


1. 实验任务1:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex1.asm进行汇编、链接、运行,使 用debug工具调试可执行文件。

1)使用edit编辑器编写ex1.asm文件

2)汇编、链接得到可执行文件,并执行;可以在页面上部看到有图案被打印在屏幕上

3)使用debug工具对程序进行调试

  使用d命令查看程序段前缀PSP所占的256个字节;一行存储32个字节,因此需要查看8*32即 查看0-8f的内存单元

 

  使用r命令查看寄存器内容,根据CX寄存器内容(表示程序段长度)使用u命令对ex1.exe进行精确反汇编

  使用g命令执行到程序退出执行之前,观察结果;可以看到页面上部有显示图案。

2. 实验任务2:使用8086汇编程序编写、汇编、链接、运行、调试方法,对ex2.asm进行汇编、链接、运行,使 用debug工具调试可执行文件。

1)使用编辑器编写汇编源程序ex2.asm

2)编译、链接、运行

 

 

3)使用debug工具调试

  精准反汇编

 

 

   调试演示;先使用g命令指定执行至程序循环入口,然后使用t命令单步调试直至下一次循环,在第二次循环中执行到loop指令时,使用p命令对loop单步调试(直接执行完所有循环),随后执行结束程序指令,t指令和p指令均可。

  修改代码,并编译链接执行;

 

   结果分析:单从显示结果上来说,ex1和ex2具有相同的功能和效果,但其实现方式不同,ex1将所有要更改的内存单元都一一进行了准确赋值,而ex2使用循环指令,设计了内存单元和值的对应关系,相较而言,使用直接赋值更加直观,而使用循环指令则功能性更强(可以通过仅修改循环次数显示更多图案)。

3. 实验任务3:综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据 0237H。

1)编写汇编程序

 

2)显示效果

 

3)将填充的字数据,从0237H 改成0239H

4)将填充的字数据,从0237H 改成0437H

  猜测:高位字节存储颜色信息,低位字节存储字符信息。

4. 实验任务4

1)使用[bx]和loop实现;指令见u命令反汇编结果

2)使用栈和loop实现;指令见u命令反汇编结果

5. 实验任务5:补全程序,实现指令的复制,并进行调试。

1)补全后的汇编源程序

 

 

 2)运行演示

 3)变量解释

  第一空 填入应该是需要复制的指令所在的段存储 即程序运行时cs中的内容;第二空 填入复制内容的字节长度 可以通过在debug中先将指令反汇编出来 然后通过看地址的大小 得出所要复制的指令长度 此题中反汇编结果为ds:0000-ds:0016 因此只要将cx赋值为016h即可。

6. 实验任务6

1)使用vi编辑器编辑汇编源程序

 

 

 2)依次使用nasm ld命令编译链接生成可执行文件

 

 

 3)运行结果

 

 

 4)修改line18中ebx的值

 

 

 5)编译链接运行

 

 

 

   猜测ebx存储的是程序返回值

二、实验总结


1. debug中的t命令和p命令都是单步调试,其中p命令在遇到循环指令,程序结束指令时会完整执行该指令,而t命令会继续单步执行所有过程。g命令可以指定执行到某一条指令之前,自由度较高。通常,搭配使用这三个命令能够满足绝大多数调试需求。

2. 推荐屏幕录制软件OBS studio(👍),以及迅捷视频转换器(👀勉强能用的mkv转gif软件),可以将调试过程以gif形式添加到博客中。

3. 关于机房内ex1直接运行或单步调试无显示结果的问题,本人遇到的是不论直接运行还是单步调试,均没有字符显示,并且使用d命令查看内存空间得到的也是无字符值;可以得出的结论是810内存单元之后的用于显示屏幕信息的内存单元无论何时都与屏幕上实际显示的内容相匹配,因此,可能产生的原因在于(1)屏幕显示范围问题,即使用单步调试时由于换行导致的前一步显示字符被上移刷新导致的无显示;但这不能解释执行运行ex1.exe也得不到显示结果的问题,或者直接运行时也有换行的出现;(2)操作系统对控制台内容的限制,由于是直接使用机房电脑实环境下的debug程序,因此不得不考虑操作系统对程序的影响;上述观点仅为推测,正在考虑下一次机房上机时对其进行验证。

posted on 2020-11-06 09:30  FreedYool  阅读(115)  评论(2)    收藏  举报