实验十三(二)中断例程对loop功能实现的简单变通

本章在用int 7ch实现loop指令功能时候,所用的参数为cx:循环次数,bx:loop指令的转移位移值。cx的值可以在调用程序里给出,而bx的值却需要用表达式表示,同时为了可以表达,也需要在中断调用指令后加一个无实际含义的"s1:nop"之类的指令,以使得可以将bx表达为"offset s-offset s1"。

其实,通过int 7ch实现loop的要点在于在循环未结束(即cx!=0)时将ip指向跳转目的偏移地址,即s处。因此,设置入口参数为bx=offset s.

;中断例程安装程序二
assume cs:code 
code segment 
start:    
mov ax,cs   
mov ds,ax    
mov si,offset do0    
mov ax,0    
mov es,ax    
mov di,200h    
mov cx,offset do0end-offset do0    
cld    
rep movsb    
mov ax,0    
mov ds,ax    
mov word ptr ds:[7ch*4],200h    
mov word ptr ds:2[7ch*4],0     
mov ax,4c00H   
int 21H
;中断例程,功能为完成loop指令功能,例程安装于0:200处 
;入口参数:cx=循环次数,bx=循环指令入口地址 
do0:    push bp   
dec cx    
jcxz ok    
mov bp,sp    
mov [bp+2],bx 
ok:pop bp    
iret 
do0end:    nop 
code ends 
end start 
;应用程序以实验十三(二)为例: 
assume cs:code 
code segment 
start:    mov ax,0b800h    
mov es,ax    
mov di,160*12    
mov bx,offset s    
mov cx,80 
s: mov byte ptr es:[di],'i'    
add di,2    
int 7ch    
mov ax,4c00H    
int 21H 
code ends 
end start 

当然,这里以位移量作为参数可以加深我们对loop指令含义的理解,loop实质为短转移,即jmp short #标记符;其实现转移的实质为通过位移量确定跳转目的地址。

原文地址:https://www.cnblogs.com/tsembrace/p/3267175.html