《汇编语言》第13章 int指令——实验13 编写、应用中断例程
(1)编写并安装 int 7ch 中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察 int、iret指令执行前后CS、IP和栈中的状态。
;sy13_1.asmassume cs:code
data segment db "welcome to masm! ",0
data endscode segment
start: mov dh,10mov dl,10mov cl,2 mov ax,data mov ds,ax mov si,0int 7ch mov ax,4c00h int 21h
code ends
end start
int 7ch 中断程序
;sy13_1i.asm 实验13(1)的 int 7c中断例程
;功能:显示一个0结束的字符串,中断例程安装在0:200处
;参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址assume cs:code
code segment
start: mov ax,cs mov ds,ax mov si,offset show_str ;设置ds:si指向源地址mov ax,0mov es,ax mov di,200h ;设置es:di指向目标地址mov cx,offset show_strend - offset show_str;设置cx为传输长度 cld ;设置传输方向为正rep movsb ;设置中断向量表 mov ax,0mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0mov ax,4c00hint 21h
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串。
;参数:(dh)=行号(取值范围0~24);
; (dl)=列号(取值范围0~79);
; (cl)=颜色;
; ds:si指向字符串的首地址。
;返回:无。
show_str: push ax push bxpush es push si mov ax,0b800h mov es,ax mov ax,160mul dh mov bx,ax ;bx=160*dh mov ax,2mul dl ;ax=dl*2 add bx,ax ;mov bx,(160*dh+dl*2)设置es:bx指向显存首地址mov al,cl ;把颜色cl赋值al mov cl,0
show0: mov ch,ds:[si] jcxz show1 ;(ds:si)=0时,转到show1执行 mov es:[bx],ch mov es:[bx+1],al inc si ;ds:si指向下一个字符地址add bx,2 ;es:bx指向下一个显存地址jmp show0
show1: pop si pop es pop bx pop ax iret mov ax,4c00hint 21h show_strend: nop
code ends
end start
运行结果:
(2)编写并安装int 7ch中断例程,功能为完成loop指令的功能。参数:(cx)=循环次数,(bx)=位移。
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察 int、iret指令执行前后CS、IP和栈中的状态。
在屏幕中间显示80个“!”。
;sy13_2.asm assume cs:code
code segment
start: mov ax,0b800hmov es,ax mov di,160*12mov bx,offset s - offset se ;设置从标号 se到标号 s的转移位移mov cx,80s: mov byte ptr es:[di],'!'add di,2 int 7ch ;如果(cx)≠0,转移到标号s处se: nop mov ax,4c00h int 21h
code ends
end start
中断程序源码
;sy13_2.asm 实现13(2)的int 7ch中断程序assume cs:code
code segment ;安装中断程序
start: mov ax,cs mov ds,ax mov si,offset lp ;设置ds:si指向源地址mov ax,0mov es,ax mov di,200h ;设置es:di指向目标地址mov cx,offset lpend - offset lp ;设置cx为传输长度cld ;设置传输方向为正rep movsb ;设置中断向量表mov ax,0mov es,ax mov word ptr es:[7ch*4],200h mov word ptr es:[7ch*4+2],0mov ax,4c00h int 21h lp: push bp mov bp,sp dec cxjcxz lpretadd ss:[bp+2],bx ;功能实质是IP = offset se + (offset s - offset se) = offset s lpret: pop bp iret ;跳转到s标号处理mov ax,4c00h int 21h
lpend: nop code ends
end start
运行调试
进入7ch中断程序代码
执行中断代码,psw,cs,ip,bp相继入栈
iret指令执行完成后回到主程序
g 0018指令结束程序
(3)下面的程序,分别在屏幕的第2、4、6、8行显示4句英文诗,补全程序。
;sy13_3.asm (3)下面的程序,分别在屏幕的第2、4、6、8行显示4句英文诗,补全程序。assume cs:code
code segment s1: db 'Good,better,best,,','$'s2: db 'Never let it rest','$'s3: db 'Till good is better,','$'s4: db 'And better,best.,','$'s: dw offset s1, offset s2, offset s3,offset s4
row: db 2,4,6,8
start: mov ax,cs mov ds,ax mov bx,offset s mov si,offset row mov cx,4
ok: mov bh,0 ;第0页mov dh,ds:[si] ;dh中放行号mov dl,0 ;dl中放列号mov ah,2 ;置光标int 10h mov dx,ds:[bx] ;ds:dx指向字符串首地址mov ah,9 ;在光标位置显示字符int 21h inc si ;行号递增add bx,2 ;指向下一字符串loop ok mov ax,4c00hint 21h
code ends
end start
运行结果:
完成后编译运行,体会其中的编程思想。