实验4 【bx】和 loop 的使用
第一问
-
编程,向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“mov ax,4c00h”和"int 21h"。
assume cs:code
code segment
mov ax,0h
mov ds,ax # 设置段前缀
mov bx,200h
mov ax,0 # 设置ax从0~63
mov cx,64
s: mov ds:[bx],ax
inc ax
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
-
下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0~0:200处,补全程序。上机调试,跟踪运行结果。
程序如下(File:LabFour2.asm):
assume cs:code
code segment
mov ax,_(1)_
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,_(2)_
s:
mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end提示: (1)复制的是什么?从哪里到哪里? 答:复制的是程序的指令,从"mov ax,(1)“开始到"loop s”。 (2)复制的什么?有多少个字节?你如何知道要复制的字节的数量 复制的是程序的指令,先运行程序,根据CX寄存器的值知道程序的长度(字节)。然后在减去从"mov ax,4c00h"指令开始的程序长度。
-
(1空):CS
根据题意将“mov ax,4c00h”之前的指令复制到内存0~0:200处。根据程序上下文已经有0020所以ax=“程序的开头处地址”,即ax=cs。cs寄存器存放代码段寄存器。
-
(2空):23。 我们先让(2空)为2即mov cx,2,debug运行程序 我们可以发现 CX=001CH 从“mov ax,4c00h”开始的指令的机器指令是B8 00 4C CD 21,占了5个字节。所以在本实验中我们要复制的代码字节数为001CH-0005H=0017H=23个字节,故CX赋值为23或17H。
-
在填第二个空那里,cx通用寄存器他有一个特点,就是在我们载入这个程序时,他会记录目前你这个程序有多长,显然这个程序有多长是code segment和code ends里面所有程序的长度,但是我们并不需要mov ax,4c00h及之后的int 21h这两句,因此我们需要扣除这两句的长度(长度为5),即sub cx,5。当然,如果严格按照mov cx,___来写,那么就需要知道mov ax,4c00h之前所有指令的长度,这个长度的确定要比用sub难得多,除非你自己能记得大概的字节长度,否则你得调试出来一个个看。
-