1. 程式人生 > >《組合語言第三版》王爽學習歷程——實驗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}。

疑惑:
當初在寫的時候有一個問題就是標號,因為最初我是把安裝程式碼寫在子程式的上面的,這樣一來子程式中所有的標號所代表的偏移地址會發生錯誤,會指向其他空間。
所以讓中斷例程以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號向上滾動一行功能:
這裡寫圖片描述