实验四
1、编程,向内存0:200~0:23F依次传送数据0·63(3FH)
assume cs:codesg
codesg segment
mov ax,0H
mov ds,ax
mov bx,200H
mov cx,64 ;0~63,共循环64次
s:mov [bx],ax
inc ax
inc bx
loop s
mov ax,4c00H
int 21H
codesg ends
end
2、只用9条指令完成上一个问题
assume cs:codesg
codesg segment
mov ax,20H
mov ds,ax
mov bx,0H
mov cx,64
s:mov [bx],bx
inc bx
loop s
mov ax,4c00H
int 21H
codesg ends
end
结果
3、下面的程序的功能是将"mov ax,4c00H"之前的指令复制到0:200处,补全程序
程序加载到内存中时,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