1.编程,向内存0:200~0:23f依次传送数据0~63(3fh),程序中只能用9条指令,包括mov ax,4c00h和int 21h
assume cs:code
code segment
mov ax,0020h
mov ds,ax
mov bx,0
mov cx,64
s: mov [bx],bl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
2.
3、下面的程序的功能是将"mov ax,4c00H"之前的指令复制到0:200处,补全程序
(1)复制的是什么?从哪里到哪里?
答:复制的是程序的指令,从"mov ax,(1)“开始到"loop s”。
(2)复制的什么?有多少个字节?你如何知道要复制的字节的数量
复制的是程序的指令,先运行程序,根据CX寄存器的值知道程序的长度(字节)。然后在减去从"mov ax,4c00h"指令开始的程序长度。
程序加载到内存中时,cs:ip会初始化为程序的首个地址,而作为程序段的段首,ip为0,所以通过ax将cs的值赋值给ds
因为不是所有代码都要复制,而程序加载后cx寄存器会存有整个程序的字节数,再通过debug算出最后两条代码的字节数
assume cs:code
code segment
mov ax,cs ;cs为补全处内容
mov ds,ax
mov ax,0020H
mov es,ax
mov bx,0
mov cx,0 ;0为暂时的补全处内容
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00H
int 21H
code ends
end
观察到cx的值为001CH,即整个程序占001CH个字节,CS:IP为076C:0
该程序从076C:0000开始,到076C:001B结束,共001CH个字节,而后两行代码占用的字节数为(001B-0017+1)5H字节,第二个补全的地方应填(001C-0005)0017H,或者看最后一条需要复制的代码占的内存单元为0015H和0016H,所以长度为0017H
最终代码为
assume cs:code
code segment
mov ax,cs ;cs为补全处内容
mov ds,ax
mov ax,0020H
mov es,ax
mov bx,0
mov cx,0017H ;0017H为补全处内容
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00H
int 21H
code ends
end