多個功能子程式的中斷例程測試程式

2021-05-22 02:26:59 字數 2859 閱讀 2085

王爽組合語言

實驗16 編寫包含多個功能子程式的中斷例程 測試程式

一、實驗要求

1、完全測試實驗16中斷例程17ch的所有功能,包含清屏、改變前景色、改變背景色、向上滾動一行

2、用乙個選單來提示使用者輸入

3、通過判斷使用者輸入的命令來呼叫響應的子過程

二、分析

1、輸出選單

定義乙個資料段,存放選單內容的幾個以『$'為結尾的字串,然後定義乙個直接定址表,存放選單各字串的首位址,通過呼叫10號中斷的2號功能改變游標位址,呼叫21號中斷的9號功能輸出字串,通過迴圈輸出全部選單

2、獲取使用者輸入

定義乙個表來存放測試的各個子過程的首位址,呼叫16號中斷的0號功能來獲取鍵盤緩衝區的資料,該資料減去30h把ascii值轉換為功能的序號,通過該序號查表獲得子過程的首位址,呼叫即可實現功能選擇

3、清屏和向上滾動一行

直接呼叫安裝的7ch號中斷的0號功能和3號功能

4、改變前景色和背景色

在資料段中定義兩個8位記憶體空間,分別用來存放前景色和背景色值。每次呼叫改變顏色的子程式,對該值增1,然後對這個數模除8,獲得乙個0-7的值,作為顏色值傳入,呼叫7ch號中斷的1號和2號功能

三、詳細設計

assume cs:code,ds:data

data segment

d1 db "0.clear screen.",'$' 

d2 db "1.set foreground.",'$'

d3 db "2.set background.",'$'

d4 db "3.scroll up a line.",'$'

d5 db "4.exit.",'$'

foreground db 0    ;這裡儲存前景色值,每次執行改變前景色命令後該值增1

background db 0    ;然後模除8,獲得乙個0-7的顏色值

menu dw d1,d2,d3,d4,d5  ;通過該錶找到字串入口位址

number dw do0,do1,do2,do3,do4 ;通過該錶找到獲取使用者輸入以後的入口位址

color dw foreground,background ;通過該錶查詢顏色值

data ends

code segment

start:

call print ;輸出選單

call do3 ;向上滾動一行

call stest ;進入測試過程,開始接受鍵盤輸入

stest:

;獲取鍵盤輸入

mov ah,0

int 16h

;ascii值轉換為序號

mov ah,30h

sub al,ah

mov ah,0

mov bx,ax ;儲存到bx中

;判斷數值的合法性

cmp bx,0

jb stest

cmp bx,4

ja stest

;通過數值找到處理子過程入口並轉移

add bx,bx

call word ptr number[bx]

jmp short stest

;子程式:清屏

do0:

mov ah,0

int 7ch

ret;子程式:改變前景色

do1:

mov bx,color[0]   ;通過顏色表找到前景色的記憶體位址

mov al,ds:[bx]   ;讀出顏色值,增加1後再寫入

inc al

mov ds:[bx],al

call rem    ;呼叫rem模除8

mov ah,1    ;呼叫7ch號中斷設定前景色

int 7ch

ret;子程式:改變背景色

do2:

mov bx,color[1]

mov al,ds:[bx]

inc al

mov ds:[bx],al

call rem

mov ah,2

int 7ch

ret;子程式:向上滾動一行

do3:

mov ah,3

int 7ch

ret;子程式:返回作業系統

do4:

mov ax,4c00h

int 21h

ret;子程式:除以8取餘

;引數:al存放要取餘的數

;返回值:al存放餘數

rem:

push bx

push ax

mov ah,0

mov bl,8

div bl

mov bl,ah

pop ax

mov al,bl

pop bx

ret;子程式:向螢幕輸出選單

print:

;清屏call do0

mov ax,data

mov ds,ax

mov cx,5

print_s:

;置游標

mov ah,2

mov bh,0

mov dh,9 ;計算顯示的行數 (行數)=4-迴圈剩餘次數+5=9-迴圈剩餘次數

sub dh,cl

add dh,dh

mov dl,30 ;列數

int 10h

;列印字串

mov dx,cx ;字串在表中的位置=5-迴圈剩餘次數

mov bx,5

sub bx,dx

add bx,bx

mov dx,menu[bx]

mov ah,9

int 21h

loop print_s

;返回ret

code ends

end start

編寫包含多個功能子程式的中斷例程

mov es,ax 在0 204存放程式 mov si,offset int7chstart ds si 中斷例程首位址 mov di,204h es di 要放中斷例程 mov cx,offset int7chend offset int7chstart 程式長度 cld 程序程式的拷貝 rep ...

子程式與中斷程式的異同 PLC程式設計基礎中斷方式

plc中均內建有中斷功能及脈衝捕捉功能。用於完成一些特定的功能應用。如,訊號捕捉 編碼器訊號中斷 脈衝測量中斷等。程式中斷時不受順控程式 主程式 的運算週期的影響,將中斷源訊號作為觸發訊號,立即執行中斷程式 中斷子程式 的功能。plc的中斷過程如下圖所示 plc程式中斷過程示意圖 現目前市面上的pl...

為什麼中斷子程式中不能使用延時和過長的程式?

a回答 通常在中斷子程式中是不呼叫延時子程式的,這樣會增加中斷處理時間,如果有其它低階中斷了,就會延誤響應中斷了。所以,中斷子程式中不要寫呼叫延時子程式,中斷子程式也不要寫得過長,處理過多的任務,要盡快處理後及時返回,如果中斷一次有很多任務需要執行完全,可以在中斷子程式中設定乙個標誌位,在主程式中查...