实验4 [bx]和loop的使用

四、实验结论

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

(1)编写汇编源程序loop1.asm

assume cs:code
code 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 21h
code ends
end

(2)对源程序 t1.asm 进行汇编、连接、运行;

step1:编译;

实验4 [bx]和loop的使用

step2:连接;

实验4 [bx]和loop的使用

step3:运行;

实验4 [bx]和loop的使用

运行程序之后会在屏幕上出现16个红色爱心,这个就是在显存中存储数据,我们所存入的0403h就代表着一个红色爱心的字符。


如果将0403h变为0441h,重新编译、连接和运行之后得到如下结果:

实验4 [bx]和loop的使用

由此可以猜测,04应该是控制红色的数据,后面两个03控制的是爱心字符,41控制的是字符A;


注:我利用了debug进行调试,运行之后查看了b800:07b8开始的连续内存如图:

实验4 [bx]和loop的使用

但是发现内存中的数据并没有改变为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 21h
code ends
end

(2)对源程序 t1.asm 进行汇编、连接、运行;

step1:编译;

实验4 [bx]和loop的使用

step2:连接;

实验4 [bx]和loop的使用

step3:运行;

实验4 [bx]和loop的使用

运行之后屏幕上没有任何显示;


以下操作是进入debug环境进行调试的:

(1)在debug中运行loop2.exe文件并查看当前各个寄存器中的值;

实验4 [bx]和loop的使用

(2)我们通过u命令进行反汇编;

实验4 [bx]和loop的使用

(3)用g命令执行到mov ax,4c00h之前;

实验4 [bx]和loop的使用

(4)用t命令单部执行;

实验4 [bx]和loop的使用

(5)下一步即将执行int 21h,接下来用p命令执行;

实验4 [bx]和loop的使用

注:如果用g命令执行到int 21h之前,则会发生如下情况:

实验4 [bx]和loop的使用

即cx的值没有发生任何改变;


任务三: 下面的程序功能是将mov ax,4c00h之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。

assume cs:code
code 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 21h
code ends
end

根据任务二,进行反汇编可以得知"mov ax,4c00h"之前的机器码的存储位置是076a:0~076a:0014,现在需要将之前的指令复制到内存0:200处,只需要将076a:0~076a:0014这段内存中的机器码复制到一0:200开始的内存空间即可。

(1)当前偏移地址为076a,所以将数据传入段寄存器CS中;

(2)由于此段内存空间有14个字节单元,所以执行14次循环;

一、对源程序 t1.asm 进行汇编、连接、运行;

实验4 [bx]和loop的使用

实验4 [bx]和loop的使用

注:Required parameter missing 的原因是什么?

二、进入debug进行调试

step1:在执行任务二之后查看当前代码的机器码所存储的位置;

实验4 [bx]和loop的使用

step2:运行copy.exe文件并查看当前各个寄存器的值;

实验4 [bx]和loop的使用

step3:进行反汇编;

实验4 [bx]和loop的使用

step4:利用g命令执行;

实验4 [bx]和loop的使用

step5:利用t命令和p命令执行;

实验4 [bx]和loop的使用

step6:查看0:200之后的字节;

实验4 [bx]和loop的使用

可以看出我们已经将数据存入了0:200开始的内存;