实验4 [bx] 和 loop的使用
(1)编程,向内存 0:200~0:23F 依次传送数据 0~63 (3FH)
(2)编程,向内存 0:200~0:23F 依次传送数据 0~63 (3FH),程序中只能使用 9 条指令,9条指令中包括“mov ax,4c00h” 和 “int 21h”。
解答:
(1)向内存 0:200~0:23F 依次传送数据 0~63,因为0~63数据是连续的,我们可以想到应该使用循环 64 次将数据依次存入 0:200~0:23F。因为 0:200~0:23F 共 64 个内存单元,因此每个单元正好存储 1 个字节,故使用 dl 寄存器循环存储 0~63,CX 寄存器设置为64(40h)用于存储循环次数,DS寄存器用于存储数据段地址,BX寄存器用于存储数据段偏移量。DL寄存器用于存储每次要复制的数。
程序代码如下
code segment
mov ax,0000h
mov ds,ax
mov bx,0200h
mov dl,0
mov cx,40h
S:
mov ds:[bx],dl
inc bx
inc dl
loop s
mov ax,4c00h
int 21h
code ends
end
注意,这里传送数据一律是按字节传送,不是按字传送!
实验结果:
(2)相对于第一题,我们可以发现,在程序执行过程中,BX寄存器的BL与DL是相等的,因此我们可以只使用BL寄存器的内容即可。
程序代码如下:
assume cs:code
code segment
mov ax,0000h ;1
mov ds,ax ;2
mov bx,0200h ;3
mov cx,40h ;4
s:
mov ds:[bx],bl ;5
inc bx ;6
loop s ;7
mov ax,4c00h ;8
int 21h ;9
code ends
end
实验结果:
(3)下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存 0:200 处,补全程序。上机调试,跟踪运行结果。
assume cs:code
code segment
mov ax, cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx, 17h
s:
mov al,[bx]
mov es:[bx],al
inc bx
mov ax,4c00h
int 21h
code ends
end
提示:
(1)复制的是什么?从哪里到哪里?
(2)复制的是什么?有多少个字节?你如何知道要复制的字节的数量?
注意,一定要做完这个实验才能进行下面的课程。
解释:
第一空:
由 mov ds,ax mov al,[bx] 和 mov es:[bx],al 可知,ds中存放的应该是代码段地址,故要填写的第一条指令为 mov ax,cs
第二空:
由 mov ax,0020h 和 mov es,ax 可知 ,es 中存放的是要复制的代码的目的位置的内存地址
由 mov al,[bx] 和 mov es:[bx],al 可知,代码复制过程是按字节复制的,每次循环赋值一个字节。所以,cx寄存器的数值等于要复制代码的字节数。
那么 mov cx, 填写的一定是一个立即数,而不是寄存器的名字,对于 mov 寄存器,立即数 型的指令占3个字节,mov 寄存器,寄存器 型的指令占2个字节。
因此这里假设 mov cx, 占3个字节,其余指令已经确定。现在使用一下debug
可以得出mov ax,4c00h指令之前的指令一共占23个字节(17h),故填入的第二个指令为mov cx,17h
理解了之后,我们对(1)(2)也做出解答,
(1)复制的是代码段地址,从 CS:0~CS:16
(2)复制的是要复制的代码所占字节数量,共23个字节(17h),根据debug调试得出