实验4 [bx]和loop的使用
(1)编程,向内存0:200~0:23F依次传送数据0~63(3FH)。
雪舞答:
0:200 ~ 0:23f单元等同于0020:00 ~ 0020:3f,代码如下:
assume cs:code
code segment
mov ax,0020h
mov ds,ax
mov bx,0
mov cx,0040h
s: mov ds:[bx],bl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
使用D命令查看0020:00~0020:3f内存写入情况:
(2)编程,向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“mov ax,4c00h”和“int 21h”。
同上,和第一题答案一样
(3)下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机测试,跟踪运行结果。
assume cs:code
code segment
mov ax,______
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,______
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
一、 复制的是什么,从哪里到哪里?
复制的是指令。从“mov ax, cs”开始到“loop s”结束。
二、复制的是什么?有多少个字节?你如何知道要复制的字节的数量?
复制的是指令。
我们知道:当我们使用debug调试一个exe文件的时候,使用 R 命令可以查看寄存器的状态,其中 CX 寄存器的值(初始值)就是该程序代码的长度(字节数)。所以,我们可以先用debug调试程序,查看 CX 寄存器的值,便可以知道程序的代码长度(字节数),然后减去从“mov ax, 4c00h”开始的代码长度(字节数),就知道了要复制的字节的数量。
具体步骤:
第一处填空:此处将ds
置为cs
,即mov as,cs
。(CS 段寄存器中存储的是指向程序代码段的段地址。)
第二处填空:暂时写为0,启用debug模式调试程序,在进入后的cx中可知程序的字节数(书p91)
也可以debug中进入U命令查看字节数:
在这里我们可以看到,代码的长度是0x1c,但由于从mov ax,4c00h开始的指令的机器指令是B8 00 4C CD 21,一共五个字节,所以长度为0x1c - 5 = 0x17
所以现在第二处填空为17h,即mov cx,17h
,执行结果为:
最终代码:
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
loop s
mov ax,4c00h
int 21h
code ends
end
注意,一定要做完这个实验才能进行下面的课程。