《組合語言第三版》王爽學習歷程——實驗16
阿新 • • 發佈:2018-12-09
編寫包含多個功能子程式的中斷例程
要求:
安裝一個新的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}。
疑惑:
當初在寫的時候有一個問題就是標號,因為最初我是把安裝程式碼寫在子程式的上面的,這樣一來子程式中所有的標號所代表的偏移地址會發生錯誤,會指向其他空間。
所以讓中斷例程以IP=0000開始,並且安裝後執行時,IP也是從0000開始。那麼標號就能對的上號了。
彙編程式碼:
assume cs:code
code segment
----------------------中斷例程------------------------------
interrupt_:
;設定直接定址表,來指向相應子程式,直接定地表也要安裝
table dw clean_screen,set_ForeColor,set_BackColor,screen_scroll
jmp interrupt_begin
interrupt_begin:
push ax ;相關reg入棧
cmp ah, 3 ;引數是否在可取範圍內
ja cmp_end
mov bx, 0
mov bl, ah
add bl, bl
call word ptr table[bx]
cmp_end:
pop ax
iret
----------------------0號子程式--------------------------------
----------------------清屏------------------------------------
clean_screen:
push es
push ax
push cx
push si
mov ax, 0b800h
mov es, ax
mov si, 0 ;初始化視訊記憶體
mov cx, 2000 ;往視訊記憶體了存入空格
print_space:
mov byte ptr es:[si], ' '
add si, 2
loop print_space
pop si
pop cx
pop ax
pop es
ret
------------------------1號子程式---------------------------------
----------------設定前景色,(al)為顏色引數---------------------------
set_ForeColor:
push es
push ax
push cx
push si
mov cx, 0b800h
mov es, cx
mov si, 1 ;初始化視訊記憶體
mov cx, 2000
set_fore:
and byte ptr es:[si], 11111000b ;設定前景色(字元色)
or es:[si], al ;為了不影響到第三位
add si, 2
loop set_fore
pop si
pop cx
pop ax
pop es
ret
------------------------2號子程式---------------------------------
----------------設定背景色,(al)為顏色引數---------------------------
set_BackColor:
push es
push ax
push cx
push si
mov cx, 0b800h
mov es, cx
mov si, 1 ;初始化視訊記憶體
mov cl, 4
shl al, cl
mov cx, 2000
set_back:
and byte ptr es:[si], 10001111b ;設定背景色
or es:[si], al ;為了不影響到第七位
add si, 2
loop set_fore
pop si
pop cx
pop ax
pop es
ret
------------------------3號子程式---------------------------------
----------------------螢幕向上滾動一行-----------------------------
screen_scroll:
push ds
push es
push ax
push cx
push di
push si
mov ax, 0b800h
mov ds, ax
mov es, ax
mov si, 160
mov di, 0
cld
mov cx, 24 ;下一行復制到上一行
copy_:
push cx
mov cx, 160
rep movsb
pop cx
loop copy_
mov cx, 80 ;最後一行用空格
print_s:
mov byte ptr es:[di], ' '
add di, 2
loop print_s
pop si
pop di
pop cx
pop ax
pop es
pop ds
ret
---------------------------子程式結束------------------------------
interrupt_end:
nop
start:
mov ax, cs ;安裝int 7ch
mov ds, ax
mov si, offset interrupt_
mov ax, 0
mov es, ax
mov di, 200h
mov cx, offset interrupt_end - offset interrupt_
cld
rep movsb
mov word ptr es:[7ch*4], 0 ;設定中斷向量表
mov word ptr es:[7ch*4+2], 20h
mov ax, 4c00h
int 21h
code ends
end start
執行結果:
測試目標:
0號清屏功能:
1號設定前景色功能:
2號設定背景色功能:
3號向上滾動一行功能: