汇编语言中断程序实例
安装一个新的int 7ch中断例程,为显示输出提供如下的功能子程序。
(1)清屏。
(2)设置前景色。
(3)设置背景色。
(4)向上滚动一行
(一)用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行;
(二)对于2、3号功能,用al传递颜色值,(al)∈{0,1,2,3,4,5,6,7}。
代码如下:
;功能:安装一个新的int7ch中断例程,实现一个子程序 setScreen ,提供如下功能:
; (1)清屏。
; (2)设置前景色。
; (3)设置背景色。
; (4)向上滚动一行
; 入口参数说明:
; (1)每个子程序用 ah 寄存器传递功能号:
; (2)对于2、3号功能,用al传送颜色值,
assume cs:code,ds:data
 data segment 
 err db ' ~~~~~ ah args is error! ~~~~~','$'
 init dw 10 dup(0)
 data ends
 
code segment
 start:
 mov ax,data
 mov ds,ax
 mov ax,0
 mov es,ax
 mov ax,es:[7ch*4]
 mov init[0],ax
 mov ax,es:[7ch*4+2]
 mov init[1],ax
 
 mov es:[7ch*4],offset setScreen
 mov es:[7ch*4+2],cs
 
 
 
 
 mov ax,102h
 int 7ch
 ;call breakPoint
 mov ax,201h
 int 7ch
 ;call breakPoint
 mov ax,300h
 int 7ch
 ;call breakPoint
 mov ax,0h
 int 7ch
 mov ax,400h
 int 7ch
 
 
 mov ax,0
 mov es,ax
 mov ax,data
 mov ds,ax
 mov ax,init[0]
 mov es:[7ch*4],ax
 mov ax,init[1]
 mov es:[7ch*4+2],ax
 
 ok: mov ax,4c00h
 int 21h
 
 
setScreen:
 jmp short setmain
 list dw sub0,sub1,sub2,sub3
 
 setmain:
 cmp ah,3
 ja subErr
 mov bl,ah
 mov bh,0
 shl bx,1
 call word ptr list[bx]
 iret
 
 sub0: ;清屏
 mov cx,0b800h
 mov es,cx
 mov cx,2000
 mov bx,0
 sub0s:
 mov byte ptr es:[bx],' '
 add bx,2
 loop sub0s
 ret
 
 sub1: ;设置前景色。
 mov cx,0b800h
 mov es,cx
 mov cx,2000
 mov bx,1
 sub1s:
 and byte ptr es:[bx],11111000b
 or es:[bx],al
 add bx,2
 loop sub1s
 ret
 
 sub2: ;设置背景色。
 mov cx,0b800h
 mov es,cx
 mov cx,2000
 mov bx,1
 shl al,1
 shl al,1
 shl al,1
 shl al,1
 sub2s:
 and byte ptr es:[bx],10001111b
 or es:[bx],al
 add bx,2
 loop sub2s
 ret
 
 sub3: ;向上滚动一行
 mov cx,0b800h
 mov es,cx
 mov ds,cx
 mov di,0
 mov si,160
 cli
 mov cx,24
 sub3s:
 push cx
 mov cx,160
 rep movsb
 pop cx
 loop sub3s
 mov cx,160
 mov bx,0
 sub3s1:
 mov byte ptr es:3840[bx],' '
 add bx,2
 loop sub3s1
 ret
 
 subErr: ;显示错误信息
 mov ax,data
 mov ds,ax
 mov ah,9
 mov dx,offset err
 int 21h
 jmp ok
breakPoint: ;设置断点,用于调试
 pushf
 pop bx
 or bh,3
 push bx
 popf
 ret
 
 code ends
 end start