《汇编语言》第16章 直接定址表——实验16 编写包含多个功能子程序的中断例程
安装一个新的int 7ch中断例程,为显示输出提供如下功能子程序。
(1)清屏;
(2)设置前景色;
(3)设置背景色;
(4) 向上滚动一行。
入口参数说明如下。
(1)用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行;
(2)对于1、2号功能,用al传送颜色值,(al)={0,1,2,3,4,5,6,7}。
中断程序源代码
;sy16_1.asm 任务:安装一个新的int 7ch中断例程
;功能:为显示输出提供功能子程序
;参数:ah传递功能号;0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行,对于2、3号功能,用al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}assume cs:code
code segment
;新的 int 7ch中断例程
s: jmp short set
table dw sub1,sub2,sub3,sub4
set: push bx cmp ah,3 ;判断ah中的功能号是否大于3 je sret mov bl,ah mov bh,0add bx,bx ;计算对应子程序在table表中的偏移call word ptr table[bx] ;调用对应的功能子程序
sret: pop bx iret
;功能:清屏
sub1: push bx push cx push es mov bx,0b800h mov es,bx mov bx,0 mov cx,2000
sub1s: mov byte ptr es:[bx],' ' add bx,2 loop sub1s pop es pop cx pop bx ret
;设置前景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}
sub2: push bx push cx push es mov bx,0b800h mov es,bx mov bx,1 mov cx,2000
sub2s: and byte ptr es:[bx],11111000b or es:[bx],al add bx,2 loop sub2s pop es pop cx pop bx ret
;设置背景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}
sub3: push ax push bx push cx push es mov cl,4 shl al,cl mov bx,0b800h mov es,bx mov bx,1 mov cx,2000
sub3s: and byte ptr es:[bx],10001111b or es:[bx],al add bx,2 loop sub3s pop es pop cx pop bx pop ax ret
;向上滚动一行
sub4: push cx push si push di push es push ds mov si,0b800h mov es,si mov ds,si mov si,160 ;ds:si指向第N+1行mov di,0 ;es:di指向第N行cld mov cx,24 ;共复制24行
sub4s: push cx mov cx,160rep movsb ;复制pop cx loop sub4s mov cx,80
sub4s1: mov byte ptr [160*24+si],' ' ;最后一行清空add bx,2 loop sub4s1 pop ds pop es pop di pop si pop cx ret
send: nop
start: mov ax,csmov ds,ax mov si,offset s ;设置ds:si指向原地址mov ax,0 mov es,ax mov di,200h ;设置es:di指向目标地址mov cx,offset send-offset s ;设置cx为传输长度cld ;设置传输方向为正rep movsb
;在中断向量表中设置新的int 7ch中断例程的入口地址cli ;设置IF=0屏蔽中断;table[bx]默认的段存器为cs,所以在安装程序中设置中断向量表时,应设:cs=200h,ip=0,而不是cs=0,ip=200h mov word ptr es:[7ch*4],0 ;IP=0mov word ptr es:[7ch*4+2],20h ;cs=20h * 10h 转换成代码段地址时会是200h CS*16 : IP
;结束mov ax,4c00h int 21h code ends
end start
测试程序源码
;sy16.asm 实验16 应用举例测试程序
assume cs:code
code segment
start: mov ax,202h ;高8位为功能号,低8位为颜色值===》2号功能,颜色设置为02h(绿色)int 7ch mov ax,4c00h int 21h code ends
end start
运行结果: