四、实验结论
任务一:综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据 0403H。
(1)编写汇编源程序loop1.asm
assume cs:codecode segment mov ax,0b800h mov ds,ax mov ax,0403h mov bx,07b8h mov cx,16 s:mov [bx],ax inc bx inc bx loop s mov ax,4c00h int 21hcode endsend
(2)对源程序 t1.asm 进行汇编、连接、运行;
step1:编译;
step2:连接;
step3:运行;
运行程序之后会在屏幕上出现16个红色爱心,这个就是在显存中存储数据,我们所存入的0403h就代表着一个红色爱心的字符。
如果将0403h变为0441h,重新编译、连接和运行之后得到如下结果:
由此可以猜测,04应该是控制红色的数据,后面两个03控制的是爱心字符,41控制的是字符A;
注:我利用了debug进行调试,运行之后查看了b800:07b8开始的连续内存如图:
但是发现内存中的数据并没有改变为0403h,而且此段内存为显存;
任务二:综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据 0~63(3FH)。
(1)编写汇编源程序loop2.asm;
assume cs:code
code segment mov ax,0h mov ds,ax mov cx,63 mov bx,200h mov ax,0 s:mov [bx],ax add ax,1 inc bx loop s mov ax,4c00h int 21hcode endsend(2)对源程序 t1.asm 进行汇编、连接、运行;
step1:编译;
step2:连接;
step3:运行;
运行之后屏幕上没有任何显示;
以下操作是进入debug环境进行调试的:
(1)在debug中运行loop2.exe文件并查看当前各个寄存器中的值;
(2)我们通过u命令进行反汇编;
(3)用g命令执行到mov ax,4c00h之前;
(4)用t命令单部执行;
(5)下一步即将执行int 21h,接下来用p命令执行;
注:如果用g命令执行到int 21h之前,则会发生如下情况:
即cx的值没有发生任何改变;
任务三: 下面的程序功能是将mov ax,4c00h之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。
assume cs:codecode segment mov ax,076ah mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,14 s:mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21hcode endsend
根据任务二,进行反汇编可以得知"mov ax,4c00h"之前的机器码的存储位置是076a:0~076a:0014,现在需要将之前的指令复制到内存0:200处,只需要将076a:0~076a:0014这段内存中的机器码复制到一0:200开始的内存空间即可。
(1)当前偏移地址为076a,所以将数据传入段寄存器CS中;
(2)由于此段内存空间有14个字节单元,所以执行14次循环;
一、对源程序 t1.asm 进行汇编、连接、运行;
注:Required parameter missing 的原因是什么?
二、进入debug进行调试
step1:在执行任务二之后查看当前代码的机器码所存储的位置;
step2:运行copy.exe文件并查看当前各个寄存器的值;
step3:进行反汇编;
step4:利用g命令执行;
step5:利用t命令和p命令执行;
step6:查看0:200之后的字节;
可以看出我们已经将数据存入了0:200开始的内存;