汇编语言中断程序实例
安装一个新的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