實驗十六
安裝一個新發int 7ch中斷例程,爲顯示輸出提供如下功能子程序
1、清屏
2、設置前景色
3、設置背景色
4、向上滾動一行
assume cs:code
code segment
start: mov ax,0
mov es,ax
mov ax,200h
mov di,ax
mov ax,cs
mov ds,ax
mov ax,offset int7c
mov si,ax
mov cx,offset int7c_end-offset int7c
cld
rep movsb ; 複製代碼到內存中
cli ; 避免受到可屏蔽中斷的影響
mov ax,0 ; 設置中斷向量表
mov ds,ax
mov word ptr ds:[07ch*4],200h
mov word ptr ds:[07ch*4+2],0
sti
mov ax,4c00h
int 21h
int7c: jmp short set
; 這裏要注意,在安裝程序中的sub1是一串數據,在中斷例程安裝在0:200h中時
; 如果仍然按照第十六章那樣設置,以是無法成功調用子程序的,因爲主程序運行完畢以後
; 主程序所佔的內存可能會被其他內容覆蓋,所以我們要把子程序安裝在中斷例程之後的內存中
; 當然這樣會存在一個問題,如果中斷例程並沒有安裝在0:200處,則table中的值也要相應改動
; 至於爲什麼子程序中的sub1s,sub2s以及loop指令還能正常工作,是因爲這是基於位移的跳轉
; 即在主程序中,相應的loop/jmp指令已經編譯爲回退/前進xx字節的指令,因此不會受位置移動的影響
table dw sub1-int7c+200h,sub2-int7c+200h,sub3-int7c+200h,sub4-int7c+200h
set: push bx
cmp ah,3 ; 判斷功能號是否大於3
ja sret
mov bl,ah
mov bh,0
add bx,bx ; 根據ah提供的功能號找到對應子程序在table中的偏移
push cs
pop ds
call word ptr [bx+200h+2] ; 調用
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
; 設置前景色
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 ; 第0、1、2位與前景色的有關
; 其他位和1與運算,保持不變
or es:[bx],al ;將前3位設置爲對應的顏色
add bx,2 ; 奇數地址表示字符屬性
loop sub2s
pop es
pop cx
pop bx
ret
; 設置背景色
sub3: 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 ; 第4、5、6位與背景色的有關
; 其他位和1與運算,保持不變
or es:[bx],al ;設置爲對應的顏色
add bx,2 ; 奇數地址表示字符屬性
loop sub3s
pop es
pop cx
pop bx
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
sub4s: push cx
mov cx,160
rep movsb ; 複製
pop cx
loop sub4s
mov cx,80
mov si,0
sub4s1: mov byte ptr [160*24+si],' ' ;最後一行清空
add si,2
loop sub4s1
pop ds
pop es
pop di
pop si
pop cx
ret
int7c_end: nop
code ends
end start
測試子程序0
assume cs:code
code segment
start: mov ah,0
;mas mov al,6
int 7ch
mov ax,4c00h
int 21h
code ends
end start
測試子程序1
assume cs:code
code segment
start: mov ah,
mov al,6
int 7ch
mov ax,4c00h
int 21h
code ends
end start
測試子程序2
assume cs:code
code segment
start: mov ah,2
mov al,6
int 7ch
mov ax,4c00h
int 21h
code ends
end start
測試子程序3
assume cs:code
code segment
start: mov ah,3
int 7ch
mov ax,4c00h
int 21h
code ends
end start