汇编实验二

实验任务1


1、ex1.asm的源码如下

 

 2、masmlink工具汇编、链接的命令行截图   

3、查看PSP段前缀所占的265个字节内容

 

 4、对其进行反汇编并使用g命令执行到程序退出之前,观察到显示器上出现彩色图案

 

 

 


 实验任务2 

1、ex2.asm源代码如下

 

 2、编译和连接的步骤,直接运行,屏幕出现彩色图案

 

 3、使用g命令执行到循环前一步,然后使用p命令跳过循环。

 

 4、使用g命令直接执行到程序结束,接着使用p命令,出现程序成功结束提示,且显示彩色图案

 

 5、将CX的值,改为8,发现屏幕上多显示了4个图像

 

分析:ex2.asm和ex1.asm在实现的功能和效果上是完全一致的,只不过ex1.asm是把字节数据逐步写到对应的显存字节地址里,而ex2.asm则是利用了字数据小端存储的原理,借助循环简便而又高效地实现了这一目标。


 实验任务3 

源代码如下

借助bx寄存器存放段的偏移地址,由于存放的是字数据,每次循环bx加2,结果如下

 

把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。

 

 把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。 

 经过观察,该字数据高位字节存放的应该是颜色信息,低位字节存放的是字符信息


实验任务4

源程序如下

 

 使用d命令查看内存0:200~0:23f内的地址

 

 

 

选做:栈实现

源代码如下,要注意栈指针初始位置的设置,利用每次push后sp+1来实现读入字数据和字节数据起到相同效果,还有一点就算寄存器ah的初始值要设为3fh,因为栈是自底部高地址向上存放字数据的。

 

 同样使用d命令查看该地址段内的内容

 

 


 实验任务5 

 寄存器cx中存放的是程序的长度,而要把程序段mov ax,4c00h之前复制到0000:0200处首先得把程序存放在cs寄存器中的起始地址通过ax赋值给ds寄存器,

 所以第一空为 mov ax,cs ,然后mov ax,4c00h和int 21h占了5个字,所以cx为cx-5,但是cx的值不知道,于是通过debug命令查询一下cx的初值为001c,所

以第二空 mov cx,0017 ,显示如下

 

posted @ 2020-10-30 16:30  rockdow  阅读(101)  评论(3)    收藏  举报