匯編語言程序設計6_第1頁
匯編語言程序設計6_第2頁
匯編語言程序設計6_第3頁
匯編語言程序設計6_第4頁
匯編語言程序設計6_第5頁
已閱讀5頁,還剩121頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第6章輸入輸出程序設計主編郭顯久大連海洋大學信息工程學院gxj@2011年8月9日《匯編語言程序設計》教材配套課件大連理工大學出版社輸入/輸出概述程序直接控制輸入/輸出方式中斷輸入/輸出方式DOS系統(tǒng)功能調(diào)用BIOS中斷調(diào)用提綱6.1.1CPU與外部設備由于外部設備種類繁多,工作原理各不相同,因此計算機與外部設備進行數(shù)據(jù)交換需要滿足兩個條件,即:首先通過相應的專門接口電路將計算機和其外部設備連接起來,接口實現(xiàn)對信號的控制與管理;其次是要有相應的軟件來驅動外部設備,使之能夠完成所要求的工作。圖6.1為計算機與外部設備連接示意圖。6.1輸入/輸出概述

在圖中,計算機的外部設備都是通過I/O接口連接到系統(tǒng)上的,I/O接口包括數(shù)據(jù)、控制和狀態(tài)三種不同性質(zhì)的信息,分別由相應的寄存器存放。1.數(shù)據(jù)寄存器:用來存放外部設備與CPU之間傳送的數(shù)據(jù),這種寄存器實際上起緩沖區(qū)的作用。不同的I/O設備要求傳送的數(shù)據(jù)類型一般是不同的,例如,向顯示器傳送數(shù)據(jù)必須是ASCII碼,而不能是二進制形式的數(shù)。2.控制寄存器:CPU給外設或接口的命令通過此寄存器進行傳送,通過控制命令告訴外設或接口要做什么。例如:CPU向打印機接口發(fā)送啟動或停止打印的命令來控制打印機。3.狀態(tài)寄存器:用來存放外設或接口的當前狀態(tài)信息,CPU通過讀取該信息,可以實時了解外設或接口的工作情況。對于輸入設備,通常用準備好(READY)信號來表示外設已準備好數(shù)據(jù),這時CPU可以從其讀入數(shù)據(jù)。對于輸出設備,通常用忙(BUSY)信號表示外設是否處于空閑狀態(tài),如處于空閑狀態(tài),則CPU可以向其發(fā)送數(shù)據(jù),否則CPU要等待。

這些寄存器都分配一個稱為I/O端口的地址編碼,CPU和內(nèi)存就是通過這些端口和外部設備進行通信的。在8086微機中,I/O端口的編址在一個獨立的地址空間中,在這個I/O空間中允許設置64K個8位或32K個16位端口地址。表6.1列出了部分I/O端口地址,對于不同型號的計算機及其接口,其I/O端口的地址有時不完全相同。

6.1輸入/輸出概述6.1.2輸入/輸出指令

CPU尋址外部I/O端口有兩種方式,一是存儲器尋址方式,在這種編址方式中,把I/O端口作為存儲器的一個存儲單元,統(tǒng)一納入存儲器地址空間,為每一個端口分配一個存儲器地址,CPU可以用訪問存儲器的方式來訪問I/O端口。這種編址方式的優(yōu)點是:不用專門設置訪問端口的指令,用于訪問存儲器的指令都可以用于訪問端口。缺點是:由于端口占用了存儲器的一部分存儲空間,使得存儲器的實際存儲空間減少;程序I/O操作不清晰,難以區(qū)分程序中的I/O操作和存儲器操作;由于指令長度比專門的I/O指令長,因此執(zhí)行時間要長。在MCS-51、MCS-96等單片機系統(tǒng)中,多數(shù)采用這種編址方法。6.1輸入/輸出概述1.輸入指令IN

指令格式:IN 累加器,端口地址IN指令是從指定端口讀取一個字節(jié)或字,傳送到AL或AX中。端口尋址可采用直接尋址或間接尋址兩種方式,當采用直接尋址時,端口地址是一個8位立即數(shù),其范圍是0~255;當采用間接尋址方式時,端口地址必須存放在DX寄存器中,其范圍是0~65535。具體指令格式有以下四種:

IN AL,PORT ;AL←(PORT)

IN AX,PORT ;AX←(PORT+1:PORT)

IN AL,DX ;AL←((DX)) IN AX,DX ;AX←((DX+1):(DX))例6.1

下面兩條指令將端口地址0028H和0029H的內(nèi)容傳送到存存器DATAW單元中。

IN AX,28H MOV DATAW,AX

例6.2LPT1打印機狀態(tài)端口地址為379H,試將其狀態(tài)信息讀入AL。

MOV DX,379H IN AL,DX6.1輸入/輸出概述2.輸出指令OUT

指令格式:OUT 端口地址,累加器OUT指令將AL(字節(jié))或AX(字)的內(nèi)容輸出到指定端口。端口尋址方式與輸入指令相同,所以輸出指令也有以下四種格式:

OUT PORT,AL ;(PORT)←(AL) OUT PORT,AX ;(PORT+1:PORT)←(AX)

OUT DX,AL ;(DX)←(AL) OUT DX,AX ;(DX+1:DX)←(AX)

例6.3LPT1打印機控制端口地址為37AH,試向其寫入控制字0CH。

MOV DX,37AH MOV AL,0CH OUT DX,AL需要注意的是:I/O指令中使用的寄存器必須是AL或AX。端口尋址方式中,間接尋址可以覆蓋直接尋址的地址范圍,但直接尋址范圍只能是0~255。I/O指令端口地址沒有使用分段尋址,因而端口地址范圍在0~65535的64KB之間。6.1輸入/輸出概述程序直接控制輸入/輸出方式又分為兩種,一是為直接方式,是指CPU可在任何時刻直接用I/O指令與外部設備進行數(shù)據(jù)交換。顯然,這種方式對外設有很高的要求,它必須能像內(nèi)存一樣時刻準備著與CPU進行數(shù)據(jù)傳遞,并且能夠跟上CPU的速度,保證傳送信息的正確性。另一種是查詢方式,有些外部設備傳遞數(shù)據(jù)的速度比較慢,而CPU執(zhí)行指令的速度比它快很多,所以如果不考慮外設與CPU之間的速度匹配問題,就可能造成數(shù)據(jù)丟失。

6.2.1直接方式直接輸入/輸出方式的優(yōu)點是硬件電路簡單,程序編寫容易,調(diào)試方便等。

例6.4

有一數(shù)據(jù)采集系統(tǒng),所采集的參數(shù)有流量、壓力和溫度。參數(shù)都經(jīng)過數(shù)字傳感器轉為數(shù)字量存入接口寄存器中,硬件連接如圖6.2所示,試編程實現(xiàn)參數(shù)的采集,并將數(shù)據(jù)存入BUFFER單元中。

如圖所示,設端口地址分別為30H、31H和32H,端口尋址是通過地址譯碼器選中和IO/M有效來選通相應的端口地址。由于所采集的物理量變化緩慢,采集的時間不受限制,傳感器輸出始終處于準備好的狀態(tài),因此可以直接訪問傳感器的端口來讀取參數(shù)。6.2程序直接控制輸入/輸出方式

DATA SEGMENTBUFFER DB 3DUP(?) ;定義數(shù)據(jù)存儲區(qū)PORT1 EQU 30H ;定義端口地址常量PORT2 EQU 31HPORT3 EQU 32HDATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATASTART: PUSH DS SUB AX,AX PUSH AX

MOV AX,DATA MOV DS,AXNEXT: LEA BX,BUFFER ;取數(shù)據(jù)存儲區(qū)有效地址

IN AL,PORT1 ;讀溫度數(shù)據(jù)

MOV [BX],AL ;存溫度數(shù)據(jù) CODE ENDS

ENDSTART6.2程序直接控制輸入/輸出方式

INC BX IN AL,PORT2 ;讀流量數(shù)據(jù)

MOV [BX],AL ;存流量數(shù)據(jù)

INC BX IN AL,PORT3 ;讀壓力數(shù)據(jù)

MOV [BX],AL ;存壓力數(shù)據(jù)

CALL TREAT ;調(diào)用數(shù)據(jù)處理子程序

JMP NEXTMAIN ENDPTREAT PROC NEAR ;數(shù)據(jù)處理子程序 ┇

RETTREAT ENDPCODE ENDS END START6.2程序直接控制輸入/輸出方式

例6.5

利用計算機8253-5定時器聲源產(chǎn)生一發(fā)聲程序。該程序按照輸入指定可發(fā)出一個或多個長音(每個長音為3秒),以及一個或多個短音(每個短音為0.5秒)。每個發(fā)音之間的間歇為0.5秒。計算機發(fā)聲系統(tǒng)硬件原理框圖如圖6.3所示。

該系統(tǒng)的發(fā)生原理是:8253-5定時器通道2計數(shù)器的門控信號由8255端口B的D0位控制,通道2計數(shù)器的輸出信號能否驅動揚聲器,還取決于8255端口B的D1位,當D0D1=11時即將定時器與揚聲器接通,可使揚聲器發(fā)出聲音。對8253-5定時器通道2計數(shù)器的編程為方式3,預置一固定的音調(diào)頻率(輸入一除數(shù)),當D0=1時,計數(shù)器開始計數(shù),通道2計數(shù)器可產(chǎn)生輸出信號。若置入計數(shù)初值為533H,則計數(shù)器可產(chǎn)生一方波頻率序列,其頻率等于6.2程序直接控制輸入/輸出方式

1.1931816MHz/533H=896Hz。8253-5定時器通道2計數(shù)器的端口地址為42H,8253-5定時器控制字寄存器的端口地址為43H。其控制字的格式及設置如下:

6.2程序直接控制輸入/輸出方式

;判斷長短音子程序(入口參數(shù):DH=發(fā)出長音個數(shù),DL=發(fā)出短音個數(shù))LSSOUND PROC NEAR PUSHF ;保護標志寄存器

CLI ;關中斷

OR DH,DH ;判斷是否發(fā)長音

JZ SHORT1LONG1: MOV BL,6 ;置長音計數(shù)器

CALL SOUND ;調(diào)發(fā)聲子程序LONG2: LOOP LONG2 ;發(fā)音之間的間歇

DEC DH ;繼續(xù)發(fā)長音嗎?

JNZ LONG1SHORT1: MOV BL,1 ;置短音計數(shù)器

CALL SOUND ;調(diào)發(fā)聲子程序SHORT2: LOOP SHORT2 ;發(fā)音之間的間歇

DEC DL ;繼續(xù)發(fā)短音嗎?

JNZ SHORT1DELAY1: LOOP DELAY1 ;發(fā)完音間歇

6.2程序直接控制輸入/輸出方式

DELAY2: LOOP DELAY2 ;返回前間歇

POPF ;恢復標志寄存器

RETLSSOUND ENDP發(fā)聲子程序(入口參數(shù):BL=發(fā)音時間,單位:0.5秒)SOUND PROC NEAR MOV AL,10110110B ;通道2方式字

OUT 43H,AL ;寫入控制字端口

MOV AX,533H ;確定896Hz除數(shù)

OUT 42H,AL ;先送LSB MOV AL,AH OUT 42H,AL ;再送MSB IN AL,61H ;讀8255端口B MOV AH,AL ;保留原端口信息

OR AL,03H OUT 61H,AL ;接通揚聲器

SUB CX,CX ;一次發(fā)聲0.5秒 6.2程序直接控制輸入/輸出方式

6.2.2查詢方式對于工作速度較低的外部設備,當CPU要向其輸出數(shù)據(jù)時,在輸出前必須要查詢外設是否處于接收數(shù)據(jù)的狀態(tài)。若處于接收狀態(tài),則CPU可執(zhí)行OUT指令,向外設輸出數(shù)據(jù),否則重新查詢,直到外設處于接收狀態(tài)為止。同樣,當CPU要從外設讀入數(shù)據(jù)時,在讀入前也必須查詢輸入設備是否處于數(shù)據(jù)準備好狀態(tài)。若數(shù)據(jù)準備好,則CPU可執(zhí)行IN指令,從外設讀入數(shù)據(jù),否則重新查詢,直到外設準備好數(shù)據(jù)為止。需要注意的是:在外設沒有準備好之前,CPU始終處于查詢等待,不能做其它操作。如果外設可能由于故障等原因始終處于未準備好狀態(tài),為防止長時間查詢而使CPU處于無限循環(huán)等待狀態(tài),則在實際查詢輸入/輸出程序中可以設定一個超時參數(shù)。即在規(guī)定的時間內(nèi),若外設沒有準備好,則放棄此次數(shù)據(jù)的交換過程。其一般查詢方式的流程圖如圖6.4所示。6.2程序直接控制輸入/輸出方式

例6.6

控制打印機以查詢方式工作,打印一個字符串,共打印10行,在打印過程中要進行超時檢查,若超時,則在顯示器上輸出“PrinterError”。打印字符串如下: “Printacharacterstring”打印機是一種可以按查詢方式工作的輸出外設,它與主機連接的接口部件是打印機適配器,也就是平常所說的“標準并行接口”。打印機接口中包含數(shù)據(jù)寄存器、狀態(tài)寄存器和控制寄存器,它們各自占據(jù)一個外設端口號碼,分別是:數(shù)據(jù)寄存器—378H,狀態(tài)寄存器—379H,控制寄存器—37AH。打印機接口的狀態(tài)寄存器和控制寄存器各位的定義如下: 打印機狀態(tài)寄存器:6.2程序直接控制輸入/輸出方式

6.2程序直接控制輸入/輸出方式

在本例中,為實現(xiàn)超時檢查,使用狀態(tài)寄存器的D0位作為超時標志,超時判斷的方法是設定一個查詢打印機“忙閑”位的次數(shù),如果在這個數(shù)內(nèi),打印機始終處于“忙”狀態(tài),則斷定為超時錯誤。該例流程圖如圖6.5所示。

6.2程序直接控制輸入/輸出方式

源程序如下:DATA SEGMENTPRINT DB ‘Printacharacterstring’,0DH,0AHRROR DB ‘PrinterError’,0DH,0AH,‘$’DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOVDX,37AH ;打印機初始化程序

MOVAL,08H ;打印機聯(lián)機

OUT DX,AL MOVCX,1000 ;維持初始化信號一段時間INIT: LOOPINIT MOV AL,0CH OUT DX,AL ;結束初始化,保持聯(lián)機

MOV CX,10 ;打印10行

6.2程序直接控制輸入/輸出方式

AGAIN: LEA BX,PRINT ;取待打印字符串首址NEXT: MOVDX,379H ;取打印機狀態(tài)寄存器地址

MOV SI,0FFFFH ;設置查詢次數(shù)

WAIT: INAL,DX ;讀入打印機狀態(tài)寄存器

TEST AL,80H JNZPRINTING ;打印機空閑,轉去送數(shù)據(jù)

DEC SI ;查詢次數(shù)減1 JNZ WAIT JMP PERROR ;超時,輸出打印機出錯PRINTING: DEC DX ;取數(shù)據(jù)端口號

MOV AL,[BX] ;取待打印字符

OUT DX,AL ;送字符到數(shù)據(jù)端口暫存

MOV DX,37AH ;選通打印機

MOV AL,0DH OUT DX,AL ;置STB信號為1 DEC AL6.2程序直接控制輸入/輸出方式

OUT DX,AL ;置STB信號為0 CMP [BX],0AH ;判斷一行結束否?

JZNEWLINE ;結束,轉打印新一行

INCBX ;修改字符串地址指針

JMPNEXTNEWLINE: LOOPAGAIN JMP EXITPRERROR: LEA DX,ERROR ;顯示打印機出錯信息

MOV AH,09H INT 21HEXIT: MOVAX,4C00H ;返回操作系統(tǒng)

INT 21HCODE ENDS END START6.2程序直接控制輸入/輸出方式

例6.7CPU要從三個設備輪流輸入數(shù)據(jù),設PROC1、PROC2和PROC3分別為設備1、設備2和設備3的數(shù)據(jù)輸入子程序;設三個設備的狀態(tài)寄存器的端口地址分別用STAT1、STAT2和STAT3表示,這三個狀態(tài)寄存器的第5位是輸入準備位,該位為“1”表示數(shù)據(jù)準備好。試編制CPU從這三個設備輪流輸入數(shù)據(jù)的程序段。INPUT: IN AL,STAT1 ;讀取設備1狀態(tài)信息

TEST AL,20H ;檢測第5位是否為1?

JZ DEV2 ;不為1,轉設備2 CALL FARPTRPROC1 ;讀入設備1的數(shù)據(jù)DEV2: IN AL,STAT2 ;讀取設備2狀態(tài)信息

TEST AL,20H ;檢測第5位是否為1?

JZ DEV3 ;不為1,轉設備3 CALL FARPTRPROC2 ;讀入設備2的數(shù)據(jù)DEV3: IN AL,STAT3 ;讀取設備3狀態(tài)信息

TEST AL,20H ;檢測第5位是否為1?

JZ NO_INPUT ;不為1,轉不輸入

CALL FARPTRPROC3 ;讀入設備3的數(shù)據(jù)NO_INPUT: ┇6.2程序直接控制輸入/輸出方式

查詢輸入/輸出方式的優(yōu)點是:可以用程序安排幾個輸入輸出設備的先后次序,來設定設備的優(yōu)先級,最先查詢的設備,其工作的優(yōu)先級最高;另外通過聯(lián)絡可以實現(xiàn)CPU與外設間的正確輸入輸出操作,從而使不同工作速度的外設可以和CPU協(xié)調(diào)工作。但缺點是:為了知道外設的工作狀態(tài),要求CPU不斷地查詢外設的狀態(tài),當查詢到的狀態(tài)不是要求的狀態(tài)時,CPU則要等待再查詢,直到所需狀態(tài)的到來。在此期間,CPU不能進行其它操作,白白浪費了CPU原本可以執(zhí)行大量指令的時間。特別是當外設輸入輸出速度較低時(如鍵盤、打印機等),CPU用于查詢的時間要比完成一次輸入輸出操作的時間長得多,從而造成了CPU的極大浪費。為解決這個問題,可采用下節(jié)介紹的中斷輸入/輸出方式。6.2程序直接控制輸入/輸出方式

中斷輸入/輸出方式就是為了提高CPU的工作效率而引入的,其基本思想是當CPU需要輸入輸出數(shù)據(jù)時,先執(zhí)行啟動外設工作的指令,然后CPU就繼續(xù)執(zhí)行原程序。如果是輸入操作,當輸入數(shù)據(jù)已存到外設接口的輸入寄存器時,或輸出操作,當外設接口輸出寄存器已空閑時,就由外設向CPU發(fā)出中斷請求。CPU收到外設中斷請求后,就暫停原來正在執(zhí)行的程序(即實現(xiàn)中斷),轉去執(zhí)行輸入(或輸出)處理程序(即中斷處理程序)。在完成所需要的輸入(或輸出)處理操作后,就返回原程序從被中斷處接續(xù)執(zhí)行。這種輸入/輸出方式不是CPU去查詢外設的狀態(tài),而是當外設完成一次輸入(或輸出)操作后,主動向CPU發(fā)出中斷請求,請求CPU為它服務。這樣就把外設忙期間的時間讓給CPU去做其它工作,因此極大地提高了CPU的工作效率。這種方式還允許CPU同時啟動多個外設,即允許CPU與多個外設同時工作。6.3中斷輸入/輸出方式

6.3.18086中斷系統(tǒng)概述中斷控制是現(xiàn)代計算機發(fā)展中的一種重要技術,它的出現(xiàn)原是為克服對外設I/O接口采用程序查詢方式所帶來的CPU低效率的弊端,故最初的中斷一律是對外設而言的,稱之為外中斷(即硬件中斷)。但隨著計算機系統(tǒng)結構的不斷復雜及應用技術日益提高,中斷的使用范圍也隨之擴大,出現(xiàn)了另外兩種中斷類型:內(nèi)中斷和軟中斷,這就構成了一個完整的計算機中斷系統(tǒng)。1.中斷源類型所謂中斷是一種使CPU中止正在執(zhí)行的程序而轉去處理特殊事件的操作。這些引起中斷的事件稱之為中斷源。中斷源可以來自于外部設備(如輸入/輸出請求)——稱為外中斷。也可以來自于內(nèi)部硬件出錯(如內(nèi)存奇偶校驗錯、協(xié)處理器異常等);或者為處理器遇到某些特殊事件(如INTN指令、除數(shù)零、運算溢出或單步執(zhí)行等)引起的,通常前者中斷源引發(fā)的中斷稱之為不可屏蔽中斷(NMI);后者中斷源引發(fā)的中斷稱為軟中斷,為區(qū)別外中斷,這里統(tǒng)稱為內(nèi)中斷。8086CPU共支持256個中斷,CPU為識別每一種中斷源,將它們從0到255編號,賦以一個中斷類型號N,簡稱為中斷類型。8086CPU的中斷源如圖6.6所示,圖中引線旁標示的是系統(tǒng)分配的中斷類型號。6.3中斷輸入/輸出方式

1)不可屏蔽中斷(NMI)不可屏蔽中斷是通過NMI信號端(中斷類型號為2)向CPU發(fā)出中斷請求的,該請求不受中斷標志位IF的影響,所以該中斷主要用于一些緊急的事件或故障處理。比如:存儲器的奇偶效驗檢測或電源故障等。2)可屏蔽中斷可屏蔽中斷是外部中斷,是通過INTR信號端向CPU發(fā)出中斷請求的,該請求受中斷標志位IF的影響。當IF設置為1時,CPU便可接受外部中斷請求,此時稱為開中斷;當IF清為0時,CPU不接受外部中斷請求,此時稱為關中斷。由圖可以看出,外部中斷是通過8259A可編程中斷控制器控制,可使8個外部中斷源通過INTR向CPU發(fā)出中斷請求。標志寄存器中的IF位只是控制是否允許CPU響應外部中斷,而不控制外部中斷源是否可以向CPU發(fā)出中斷請求。這個功能可由8259A的8位中斷屏蔽寄存器來實現(xiàn),它的端口地址為21H,用來控制8個外部中斷源是否允許向CPU申請中斷,屏蔽寄存器如圖6.7所示。當某位為0時,允許外部設備中斷;當為1時,禁止(屏蔽)外部設備的中斷。因此,某個外設要想實現(xiàn)CPU響應其中斷請求,必須滿足IF=1和相應位為0這兩個條件。6.3中斷輸入/輸出方式

例如:允許鍵盤中斷,可用下列指令實現(xiàn):

STI ;開中斷

IN AL,21H;讀取中斷屏蔽寄存器

AND AL,11111101B ;鍵盤中斷允許位置0 OUT 21H,AL ;寫入中斷屏蔽寄存器3)內(nèi)中斷內(nèi)中斷不受中斷標志位的影響,一旦出現(xiàn)這種中斷,CPU就響應這一中斷并執(zhí)行相應處理程序。(1)INT指令引起的內(nèi)中斷當CPU執(zhí)行完一條INTN指令后,立即產(chǎn)生中斷并調(diào)用系統(tǒng)中相應的中斷處理程序來完成中斷功能。N為中斷類型號,系統(tǒng)可提供256個中斷類型號,除系統(tǒng)占用的類型號以外,用戶可以利用保留的類型號來擴充新的中斷處理功能。6.3中斷輸入/輸出方式

(2)INTO中斷該中斷為溢出中斷,其類型號為4,當程序執(zhí)行過程中,遇到INTO指令時,且此時溢出標志OF=1,則產(chǎn)生中斷并轉入溢出中斷處理程序。該處理程序只是給出一個出錯信息,在處理程序結束時,不返回原程序而返回系統(tǒng)。若遇到INTO指令,但此時OF=0,則CPU繼續(xù)執(zhí)行原程序。例如下面的指令用來測試加法的溢出:

ADD AX,VALUE INTO

(3)除法錯誤中斷該中斷的類型號為0,當除數(shù)為零或商超過了寄存器所能表達的范圍時,則CPU自動產(chǎn)生0號中斷,并給出該中斷的入口地址。用戶可編寫相應的中斷處理程序,以解決除法溢出問題。(4)單步中斷當把單步標志位TF置為1時,則在每執(zhí)行完一條指令后,CPU自動產(chǎn)生類型號為1的中斷—單步中斷。在中斷處理程序的控制下,給出有關寄存器的內(nèi)容和各狀態(tài)標志位的狀態(tài)。使用單步中斷可以一條指令一條指令地跟蹤程序的運行,這在調(diào)試程序時非常有用。6.3中斷輸入/輸出方式

2.中斷優(yōu)先級1)中斷優(yōu)先級在外中斷、內(nèi)中斷中有多個中斷源,為解決同時有多個中斷源向CPU發(fā)出中斷請求時的響應問題,CPU規(guī)定了中斷源的優(yōu)先級,中斷源的優(yōu)先順序為:除法錯誤→INTO→INTN→NMI→INTR→單步中斷。其中:在INTR(可屏蔽中斷)中,有8個中斷源,分別命名為IRQ0~IRQ7,系統(tǒng)默認IRQ0優(yōu)先級最高,以后依次降低,IRQ7最低。由于這8個中斷源受8259A可編程中斷控制器控制,因此IRQ0~IRQ7可由8259A中斷命令寄存器改變它們的優(yōu)先級。當有多個中斷源同時發(fā)出中斷申請時,CPU將根據(jù)上述規(guī)定的優(yōu)先次序,首先響應優(yōu)先級最高的中斷請求,在完成該中斷處理程序后,再響應次高優(yōu)先級的中斷請求。以優(yōu)先級順序逐個處理各中斷源的中斷請求。6.3中斷輸入/輸出方式

2)8259A中斷命令寄存器8259A中斷命令寄存器的端口地址為20H,各位如圖6.8所示。例如:IRQ0~IRQ7為正常優(yōu)先級順序,現(xiàn)要求IR4為最低級中斷請求,則向中斷命令寄存器發(fā)送如下命令:

MOV AL,11100100B OUT 20H,AL命令執(zhí)行完后,優(yōu)先級的順序為:IRQ5,IRQ6,IRQ7,IRQ0,IRQ1,IRQ2,IRQ3,IRQ46.3中斷輸入/輸出方式

(3)EOI:中斷結束位,當EOI=1時,當前正在處理的中斷請求被清除。所以在每個中斷處理程序結束時,必須把中斷結束位置1,這表明該中斷處理程序結束,并允許該中斷源重新發(fā)出中斷請求。否則,該中斷源不能再發(fā)出中斷請求,同時也會屏蔽掉對以后同級或低級中斷的處理。當然在必要時候,在中斷處理程序中也可利用EOI位清除當前的中斷請求,使得在中斷處理的過程中又能響應同級或低級中斷請求。清除硬件中斷用如下命令:

IN AL,20H OR AL,00100000B OUT 20H,AL3)中斷嵌套所謂中斷嵌套是指計算機正在執(zhí)行一個中斷處理程序時,有另一個優(yōu)先級更高的中斷源提出中斷請求,這時計算機會暫時終止當前正在執(zhí)行的級別較低的中斷源的中斷處理程序,轉去處理高優(yōu)先級的中斷處理程序,待處理完畢后,再返回到被中斷了的中斷處理程序繼續(xù)執(zhí)行的過程。6.3中斷輸入/輸出方式

80X86沒有規(guī)定中斷嵌套的層次,但在實際使用時,多重的中斷嵌套要受到堆棧容量的限制,所以在編寫中斷程序時,一定要考慮有足夠的堆棧單元來保存多次中斷的斷點及各寄存器的內(nèi)容。為實現(xiàn)中斷嵌套,需要注意的是:在每一個中斷處理程序的開始部分要用STI指令將IF位置1—開中斷,這樣計算機在執(zhí)行該中斷處理程序過程中,可以響應比該中斷源優(yōu)先級更高的中斷源的中斷請求。若在中斷處理程序中發(fā)出中斷結束命令,即EOI位置1,則計算機在執(zhí)行該中斷處理程序過程中,在發(fā)出中斷結束命令后,還可以響應同級或低優(yōu)先級中斷源的中斷請求。6.3中斷輸入/輸出方式

例6.8

在正常優(yōu)先級方式下,假設在主程序執(zhí)行過程中,IR2和IR4同時發(fā)出中斷請求,而后IR1申請中斷,最后IR3的中斷請求也到達。其中斷處理順序如下:由于IR2比IR4中斷優(yōu)先級高,所以CPU首先響應IR2,從主程序轉去處理IR2的中斷處理程序。進人IR2中斷處理程序后,立即將IF置為1。當IR1的中斷請求到達后,因IR1的優(yōu)先級高于IR2,CPU就立即中止執(zhí)行IR2的程序,轉去執(zhí)行IR1的中斷處理程序。在IR1處理程序中,由指令發(fā)出了EOI命令,結束了IR1的中斷請求。返回IR2處理程序后,同樣由于發(fā)出EOI命令清除了IR2的中斷請求,所以在較低優(yōu)先級的中斷請求IR4到達后,即轉向處理IR4的中斷請求。在IR4處理程序的執(zhí)行過程中,IR3的中斷請求到達,當判斷IF已被置為1,則又中斷了IR4的程序,轉去執(zhí)行IR3的中斷處理程序。在IR3程序中,也發(fā)出了開中斷指令(STI)和中斷結束命令(EOI),最后IRET指令使其返回到IR4程序,IR4的程序在返回IR2的程序之前也發(fā)出了EOI命令,結束了IR4的中斷請求。IR2中斷請求在前面已被清除,所以IR4執(zhí)行完后,返回IR2繼續(xù)執(zhí)行直到返回主程序。各中斷處理程序的執(zhí)行順序如圖6.9所示。6.3中斷輸入/輸出方式

6.3.2中斷向量表1.中斷向量表

在8086中斷系統(tǒng)中,為每種中斷都安排了一個中斷類型號(類型號為0~0FFH),每種類型的中斷都有相應的中斷處理程序,來完成中斷的任務。為了方便管理中斷處理程序,系統(tǒng)把所有的中斷處理程序的入口地址都集中在一起,構成一個中斷向量表。每個入口地址占4個字節(jié),高2個字節(jié)存放中斷處理程序的段基址,低2個宇節(jié)存放中斷處理程序的段內(nèi)偏移地址。各中斷處理程序的入口地址是按中斷類型號的順序存放在中斷向量表中,因此每類中斷向量的地址可由中斷類型號乘以4計算出來。例如:當類型號8中斷發(fā)生時,則系統(tǒng)從中斷向量表地址4×8=0010H中取得8號類型的中斷處理程序的入口地址,分別送入IP和CS寄存器中,CPU就可以轉入相應的中斷處理程序。256個中斷處理程序的入口地址共占用1024個字節(jié)空間,位于存儲器0000:0000H~0000:03FFH地址空間,中斷向量表如圖6.10所示。6.3中斷輸入/輸出方式

表6.2列出了80x86各類型中斷在中斷向量表中的地址。2.存取中斷向量我們知道,中斷向量表是用來存放中斷程序的入口地址的,當某類型中斷請求被CPU響應后,CPU就到中斷向量表中取得該類型中斷的中斷處理程序的入口地址,分別送入IP和CS寄存器中,即可運行該中斷的處理程序。如果要想計算機運行用戶自己編寫的中斷處理程序,用戶可以利用保留的中斷類型號來實現(xiàn)這一功能。具體做法是:將用戶編寫的中斷處理程序的入口地址存入中斷向量表即可。6.3中斷輸入/輸出方式

例6.9

設N為保留的中斷類型號,有一中斷處理程序INTPR,當執(zhí)行INTN指令后,即可運行INTPR程序。試編寫程序段實現(xiàn)這一功能。CODE SEGMENTMAIN PROC FAR ┇ ;將中斷處理程序的入口地址存入中斷向量表

MOV AX,0 ;ES←中斷向量表段基址

MOV ES,AX MOV BX,N*4 ;BX←類型號N的偏移地址

MOV AX,OFFSETINTPR ;AX←中斷處理程序偏移地址

MOV ES:WORDPTR[BX],AX;置中斷處理程序的偏移地址

MOV AX,SEGINTPR ;AX←中斷處理程序的段地址

MOV ES:WORDPTR[BX+2],AX;置中斷處理程序的段地址 ┇

INT N ;即可轉入INTPR ┇MAIN ENDP6.3中斷輸入/輸出方式

INTPR PROC NEAR ;中斷處理程序 ┇

IRET ;中斷返回指令INTPR ENDPCODE ENDS在上例中,ES存放中斷向量表的段基址,BX存放中斷類型號N在中斷向量表的偏移地址。首先將類型號N的中斷處理程序入口地址中的偏移地址和段地址分別存入中斷向量表。這樣當執(zhí)行INTN指令后,便可執(zhí)行INTPR中斷處理程序。如果用戶自己編寫的中斷處理程序代替系統(tǒng)某個中斷類型的中斷處理程序時,需要注意保存原有的中斷向量。即在設置用戶自己的中斷向量時,首先保存原有的中斷向量,然后再設置用戶的中斷向量,最后在用戶的中斷處理程序結束前恢復原中斷向量。在存取中斷向量時,最好不直接使用中斷向量的絕對地址,而是利用DOS系統(tǒng)調(diào)用的21H類型中的25H和35H號功能來實現(xiàn)中斷向量的存取,具體操作見表6.3。6.3中斷輸入/輸出方式

例6.10

用DOS系統(tǒng)功能調(diào)用完成例6.9的中斷向量的存取CODE SEGMENTMAIN PROC FAR ┇;從中斷向量表中取原中斷向量

MOV AL,N ;AL←中斷類型號

MOV AH,35H INT 21H PUSH ES ;保存原中斷向量

PUSH BX;將新的中斷向量存入中斷向量表中

PUSH DS MOV AX,SEGINTPR;DS←中斷處理程序的段地址

MOV DS,AX MOV DX,OFFSETINTPR ;DX←偏移地址

MOV AL,N ;AL←中斷類型號 MOV AH,25H INT 21H 6.3中斷輸入/輸出方式

POP DS ┇ INT N ;即可轉入INTPR ┇;在中斷向量表中恢復原中斷向量

POP DX ;從堆棧中取出原中斷向量 POP DS ;將原中斷向量存入中斷向量表 MOV AL,N MOV AH,25H INT 21H ┇MAIN ENDPINTPR PROC NEAR ;中斷處理程序 ┇

IRET ;中斷返回指令INTPR ENDPCODE ENDS6.3中斷輸入/輸出方式

6.3.3中斷過程一個中斷源的中斷請求一旦被響應,系統(tǒng)便進入中斷響應周期,CPU中斷系統(tǒng)自動完成下列操作:1.取中斷類型號N;2.標志寄存器(FLAGS)內(nèi)容入棧;3.當前代碼段寄存器(CS)內(nèi)容入棧;4.當前指令指針寄存器(IP)內(nèi)容入棧;5.禁止硬件中斷和單步中斷(IF=0,TF=0);6.從中斷向量表偏移地址4×N單元中取字內(nèi)容送入IP,從偏移地址4×N+2單元中取字內(nèi)容送入CS;7.轉去執(zhí)行中斷類型號N的中斷處理程序;8.當中斷處理程序執(zhí)行完后,恢復斷點,即從堆棧中彈回斷點的偏移地址和段基址到IP和CS,并從堆棧中恢復標志寄存器內(nèi)容,即實現(xiàn)了中斷的返回。6.3中斷輸入/輸出方式

由于在中斷發(fā)生時,CPU自動清除了IF和TF位,這就使得CPU轉入中斷處理程序后,不再允許再產(chǎn)生新的中斷。如果在此期間,還允許外部的中斷請求,可在中斷處理程序的開頭通過STI指令再將IF位置1即可。此外,需要注意的是設備發(fā)到CPU的中斷請求信號在時間上是隨機的,如果此時CPU正在執(zhí)行一條一般的指令,則要等這條指令執(zhí)行完后,CPU才響應中斷。但對加封鎖的指令(如LOCKMOVAX,BX)應看作為一條指令處理;對加重復前綴的串指令(如REPMOVSB),也要作為一個整體來處理,但不是把串操作全部重復執(zhí)行完,而是執(zhí)行一次重復和串指令即可響應中斷;對MOV指令和POP指令,如果處理對象是段寄存器,那么本條指令執(zhí)行完后,接著再執(zhí)行一條指令才響應中斷。對開中斷指令STI和中斷返回指令IRET,也是要在STI或IRET指令執(zhí)行完后,再執(zhí)行一條指令才響應中斷。6.3中斷輸入/輸出方式

6.3.4中斷處理程序舉例1.中斷處理程序結構中斷處理程序是因中斷源請求而運行的滿足中斷源要求的特定功能程序,因此中斷處理程序是為該中斷源服務的。中斷處理程序的結構與子程序(即過程)相似,所有編寫過程的一些規(guī)定和要求均適用于中斷處理程序,包括用偽指令PROC/ENDP定義中斷處理程序。但它與子程序的編寫也有一些不同之處,下面是編寫中斷處理程序的典型結構。

1)現(xiàn)場保護:由于中斷請求是隨機發(fā)生的,它可能出現(xiàn)在執(zhí)行程序中的任何部分,因此必須進行現(xiàn)場保護,以保證在執(zhí)行完中斷處理程序后,能夠正確返回被中斷的原程序斷點處。一般來說,如果中斷處理程序較簡單,所用寄存器不多,則只需保護處理程序中使用的寄存器即可;但當中斷處理程序較復雜,且使用較多寄存器時,則應保護所有的寄存器。2)中斷嵌套:由中斷過程知道,當CPU響應一個中斷時,總是自動把IF和TF位清0,禁止新的可屏蔽外中斷源的請求,所以為了實現(xiàn)多級中斷處理,應在中斷處理程序的適當位置(例如已保護好現(xiàn)場)上使用開中斷指令STI,使CPU的IF位置1,以便允許CPU響應高優(yōu)先級中斷源的中斷請求,實現(xiàn)中斷源的嵌套使用。6.3中斷輸入/輸出方式

3)中斷結束命令:對于外部中斷,根據(jù)8259A中斷控制器的使用要求,在中斷處理程序某個位置或返回之前,應該發(fā)一條中斷結束命令給8259A中斷命令寄存器(端口地址為20H),撤消中斷標志位,以便接收新的中斷請求。

4)中斷返回:中斷處理程序返回時,應使用IRET指令,而不是過程返回指令RET。這是因為在中斷響應時,中斷邏輯將進行標志寄存器及斷點的自動保護,所以在中斷返回時,只有IRET指令才能自動恢復斷點和標志寄存器的內(nèi)容,而RET指令并不能恢復標志寄存器的內(nèi)容。6.3中斷輸入/輸出方式

例6.11中斷處理程序的典型結構INTSTR PROC NEAR[/FAR] STI ;開中斷

PUSH AX ;保護現(xiàn)場

PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI PUSH DS PUSH ES ┇ ;中斷處理程序主體 ┇

MOV AL,20H;發(fā)中斷結束命令(EOI=1)

OUT 20H,AL POP ES ;恢復現(xiàn)場

POP DS POP DI POP SI POP DX POP CX POP BX POP AX IRET ;中斷返回INTSTRENDP6.3中斷輸入/輸出方式

2.中斷處理程序舉例例6.12

編寫以中斷方式打印輸出一個字符串的程序。假定字符串存放在BUFF開始的單元,字符串長度存放在CONT單元。印機是輸出的機械設備,速度比CPU的處理速度慢得多。因此通常利用中斷傳送方式打印信息,在打印機空閑時,請求CPU給它打印數(shù)據(jù),而不用讓CPU不停地查詢,這樣可使CPU和打印機并行工作,以節(jié)省大量的CPU時間。采用中斷方式打印字符時,首先將待打印的字符由CPU送人打印機的數(shù)據(jù)寄存器,然后通過控制寄存器發(fā)送一個選通信號給打印機。當打印機把字符打印完畢之后,通過狀態(tài)線發(fā)送一個認可信號給CPU。允許CPU發(fā)送下一個字符。這時如果打印機工作在中斷方式,那么同時向CPU發(fā)中斷請求信號(通過8259A的IR7,中斷類型號為0FH)。打印機接口中的數(shù)據(jù)寄存器、狀態(tài)寄存器和控制寄存器端口地址分別是378H、379H、37AH,其狀態(tài)寄存器和控制寄存器的定義見例6.6。6.3中斷輸入/輸出方式

DATA SEGMENT ;定義數(shù)據(jù)段BUFF DB ‘8086CPUPrinterInterruptProgram’,0AH,0DHCONT DB $-BUFFDATA ENDSSTACK SEGMENT STACK ;定義堆棧段

DW 100HDUP(?)TOS LABEL WORDSTACK ENDSCODE SEGMEN ASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FARSTART: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSETTOS;設置棧頂指針寄存器SP MOV AL,0FH ;保存原中斷向量

MOV AH,35H

6.3中斷輸入/輸出方式

INT 21H

PUSH ES PUSH BX PUSH DS

MOV AX,SEGPINT ;中斷處理程序入口的段基址

MOV DS,AX MOV DX,OFFSETPINT;入口的偏移地址

MOV AX,250FH ;設置打印中斷處理程序向量

INT 21H POP DS IN AL,21H ;讀8259A的中斷控制寄存器

AND AL,7FH ;8259A允許打印機中斷

OUT 21H,AL MOV DX,37AH ;DX←控制寄存器地址

MOV AL,00011100B ;置打印機為中斷工作方式

OUT DX,AL6.3中斷輸入/輸出方式

MOV DX,378H ;DX←數(shù)據(jù)寄存器地址

MOV BX,OFFSETBUFF ;取打印緩沖區(qū)首地址

MOV AL,[BX] ;取第一個字符

OUT DX,AL ;送打印機數(shù)據(jù)寄存器

INC BX ;緩沖區(qū)地址加1 DEC CONT ;字符串長度減1 STI ;開中斷

MOV DX,37AH ;選通打印機

MOV AL,1DH OUT DX,AL ;置STB信號為1 DEC AL OUTDX,AL ;置STB信號為0 MOV SI,0FFFFH ;處于中斷等待狀態(tài)WAITP: MOV DI,0FFFFH ;實際應用可運行其它程序WAITP1: DEC DI JNZ WAITP1 DEC SI JNZ WAITP6.3中斷輸入/輸出方式

POP DX ;恢復原中斷向量

POP DS MOV AL,0FH MOV AH,25H INT 21H MOV AX,4C00H ;返回系統(tǒng)

INT 21HMAIN ENDPPINT PROC NEAR ;打印機中斷處理程序

PUSH AX ;保護現(xiàn)場

PUSH CX MOV AL,[BX] ;取下一個字符

MOV DX,378H ;送打印機數(shù)據(jù)寄存器

OUT DX,AL INC BX DEC CONT ;未打印完,退出中斷

JNZ EXIT6.3中斷輸入/輸出方式

MOV DX,37AH MOV AL,00001100B;打印完,禁止打印機中斷

OUT DX,ALEXIT: MOV AL,20H ;發(fā)出中斷結束命令

OUT 20H,AL POP CX ;恢復現(xiàn)場

POP AX IRET ;中斷返回PINT ENDPCODE ENDS END START6.3中斷輸入/輸出方式

例6.13

利用保留的中斷類型號65H設置內(nèi)中斷處理程序。要求該處理程序顯示用戶定義的字符串,字符串結尾標志符為“$”,串長度不超過256個字符(含回車換行符)。調(diào)用參數(shù):AX存放字符串首地址。返回參數(shù):BX存放實際顯示的字符數(shù)。當顯示字符數(shù)超過256時,(BH)=0FFH。源程序如下:DATA SEGMENT BUFF DB ‘Thisisaexampleaboutsoftinterrupt.’,0AH,0DH,’$’ERR DB ‘ERROR!’,0AH,0DH,’$’DATA ENDSSTACK SEGMENT STACK DW 100HDUP(?)TOS LABEL WORDSTACK ENDSCODE SEGMEN ASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FARSTART: MOV AX,DATA6.3中斷輸入/輸出方式

MOV DS,AX MOV AX,STACK MOV SS,AX MOV SP,OFFSETTOS PUSH DS MOV AX,SEGINT65H;中斷處理程序入口的段基址

MOV DS,AX MOV DX,OFFSETINT65H ;入口的偏移地址

MOV AX,2565H;設置新中斷處理程序的中斷向量

INT 21H POP DS MOV AX,OFFSETBUFF;取待顯示字符串首地址

INT 65H ;調(diào)用65H類型中斷

CMP BH,0FFH ;判斷是否超過256個字符?

JNZ EXIT LEA DX,ERR ;超過顯示錯誤信息

MOV AH,9 INT 21H6.3中斷輸入/輸出方式

EXIT: MOV AX,4C00H INT 21HMAIN ENDPINT65H PROC NEAR ;65H內(nèi)中斷處理程序

PUSH DX ;保護現(xiàn)場

PUSH SI MOV BX,0 ;字符計數(shù)器清0 MOV SI,AXLOP: MOV DL,[SI];取字符

CMP DL‘$’ ;是結尾標志符嗎?

JZ OVER ;是,轉OVER MOV AH,2 ;顯示字符

INT 21H INC BX JMP LOP ;沒顯示完,繼續(xù)OVER: CMP BH,0 ;判斷超過256個字符?

JZ QUIT ;結束

MOV BH,0FFH;超過,置BH為0FFHQUIT: POP SI ;恢復現(xiàn)場 POP DX

IRET ;中斷返回INT65H ENDPCODE ENDS END START一般增加新的內(nèi)中斷,大多是系統(tǒng)開發(fā)時所需要。此時,就應該對原操作系統(tǒng)作些修改,以使新增加的內(nèi)中斷成為系統(tǒng)程序的一部分,再使用時就可以直接用內(nèi)中斷指令調(diào)用了。如果僅是在自己的應用系統(tǒng)中,要設置一些內(nèi)中斷以方便程序設計,滿足應用系統(tǒng)的需要,此時只在自己的程序中編寫相應的內(nèi)中斷處理程序,并填寫其入口地址到中斷向量表中即可。6.3中斷輸入/輸出方式

DOS系統(tǒng)為用戶提供了近百個功能子程序,可供匯編語言程序設計時直接調(diào)用。這樣,程序員就不必編寫這些繁雜的程序,也不必為此去搞清有關的設備、電路及接口等,而只須遵循DOS規(guī)定的調(diào)用方法就可直接調(diào)用了。對于機器的使用者來說,這些子程序都可看作是操作系統(tǒng)向用戶提供的軟件資源,又稱為軟接口。這些子程序的主要功能包括基本輸入/輸出管理(如鍵盤、顯示器、打印機、磁盤等的管理)、文件和目錄管理、其它管理(如內(nèi)存、時間、日期等管理)等。DOS系統(tǒng)功能調(diào)用都利用INT21H中斷指令,為了使用方便,系統(tǒng)已將所有功能子程序放在其中斷服務程序中并按順序編號,這個編號就是子程序的功能號。其調(diào)用方法是:(1)AH←功能號;(2)指定寄存器←入口參數(shù);(3)INT21H。用戶只須給出以上三方面信息,DOS就可根據(jù)所給信息自動轉入相應子程序執(zhí)行。下面就一些典型的系統(tǒng)功能調(diào)用進行介紹。6.4DOS系統(tǒng)功能調(diào)用6.4.1鍵盤輸入功能調(diào)用1.鍵盤字符碼和掃描碼鍵盤和主機通過五芯電纜相連,這五根線分別是電源線、地線、復位線以及鍵盤數(shù)據(jù)線和鍵盤時鐘線。PC機系列的鍵盤觸點電路按16行×8列的矩陣來排列,用單片機Intel8048來控制對鍵盤的掃描。按鍵的識別采用行列掃描法,即根據(jù)對行線和列線的掃描結果來確定閉合鍵的位置,并通過鍵盤數(shù)據(jù)線將閉合鍵所對應的掃描碼(8位)送往主機。當在鍵盤上“按下”或“放開”一個鍵時,如果鍵盤中斷是允許的,就會產(chǎn)生一個類型9的中斷,并轉人到BIOS的鍵盤中斷處理程序。該處理程序從8255可編程序接口芯片的輸人端口60H讀取一個字節(jié),這個字節(jié)的低7位是鍵的掃描碼。最高位為0或為1,分別表示鍵是“按下”狀態(tài)還是“放開”狀態(tài)。按下時,取得的字節(jié)稱為通碼,放開時取得的字節(jié)稱為斷碼。如按下ESC鍵時產(chǎn)生一個通碼為01(0000001B),放開ESC鍵時產(chǎn)生一個斷碼為81H(1000000lB)。鍵盤上的每個鍵都對應一個掃描碼,所以根據(jù)掃描碼就能唯一地確定哪一個鍵改變了狀態(tài)。表6.4是鍵盤上每個鍵對應的掃描碼(十六進制)。6.4DOS系統(tǒng)功能調(diào)用2.系統(tǒng)功能調(diào)用表6.5列出了與鍵盤有關的DOS系統(tǒng)功能調(diào)用,它包括單字符的讀入和把一個字符串讀入存儲器緩沖區(qū)的功能。

6.4DOS系統(tǒng)功能調(diào)用1)單字符輸入鍵盤單字符輸入的INT21H系統(tǒng)功能調(diào)用有1、6、7和8號功能,它們的主要區(qū)別是是否檢測Ctrl-Break和是否將鍵入的字符回顯在屏幕上。其中6號功能既可用于顯示器輸出又可用于鍵盤輸入,在用于鍵盤輸入時,若無字符就緒,則ZF=1且AL=0,否則Z=0且AL=輸入的字符,該字符不回顯??梢允褂萌缦麓a序列完成鍵盤輸入(其中功能號7和8與1相同):

MOV AH,01H INT 21H MOV CHAR,AL;保存鍵入的字符 ┇WAIT:MOV AH,06H MOV DL,0FFH;用于鍵盤輸入

INT 21H JZ WAIT ;若無字符,則等待

MOV CHAR,AL;保存鍵入的字符 ┇

MOV AH,06H MOV DL,n ;n=00H~0FEH 6.4DOS系統(tǒng)功能調(diào)用

INT 21H ;用于顯示DL中的字符 ┇CHAR DB ? ;定義保存字符變量2)字符串輸入0AH號功能提供從鍵盤輸入1個字符串(包括回車符)送至應用程序指定的輸入緩沖區(qū)功能。該緩沖區(qū)的設置規(guī)定如下:(1)第1個字節(jié)設置為緩沖區(qū)能容納的最大字符數(shù)(1~255)。(2)第2個字節(jié)存放輸入的實際字符數(shù)(不包含回車符)。(3)第3個字節(jié)開始存放輸入字符的ASCII碼值。如果輸入的字符數(shù)超過緩沖區(qū)所能容納的最大字符數(shù),則隨后的輸入被丟棄并且響鈴,直至檢測到一個回車鍵為止。在執(zhí)行過程中,由鍵盤輸入的字符并不立即存放到指定的緩沖區(qū),而是先存入DOS內(nèi)部的鍵盤字符緩沖區(qū)(長達128個字節(jié))。這樣,輸入的字符串中允許通過退格鍵、刪除鍵或其它DOS內(nèi)部鍵盤驅動程序可識別的常用編輯鍵進行修改,也可由Ctrl-C中止該功能調(diào)用,直到鍵入回車符后,才將包括回車在內(nèi)的所有實際輸入宇符,由DOS內(nèi)部緩沖區(qū)復制到應用程序指定的輸入緩沖區(qū)中。通常使用該功能的調(diào)用格式如下:6.4DOS系統(tǒng)功能調(diào)用MAXLEN DB 50 ;緩沖區(qū)容納最大的字符數(shù)ACTLEN DB ? ;用于存放實際輸入的字符數(shù)STRING DB 50DUP(?) ;存放輸入的字符串(包含回車) ┇ MOV AH,0AH ;AH←功能號

MOV DX,SEGMAXLEN ;DS←緩沖區(qū)的段基址

MOV DS,DX MOV DX,OFFSETMAXLEN;DX←緩沖區(qū)的偏移地址

INT 21H ;讀鍵盤輸入的字符串 ┇6.4DOS系統(tǒng)功能調(diào)用6.4.2顯示輸出功能調(diào)用DOS系統(tǒng)提供了3個顯示輸出的系統(tǒng)功能調(diào)用子程序,它們分別提供了每次顯示輸出1個字符或1個字符串的功能,這些功能都自動向前移動光標,即光標跟隨字符(串)移動。顯示輸出的3個子功能見表6.6。這里2號功能是顯示一個字符,并檢查Ctrl-Break。在調(diào)用時,對DL中的字符ASCII碼值(如:Ctrl-C:03H)、回車碼:0DH、換行碼:0AH、響鈴碼:07H和退格碼:08H等控制碼)都會作相應的處理。此外,20H~7FH的字符在屏幕上正常顯示。6號功能見鍵盤的系統(tǒng)調(diào)用。對于9號功能子程序,在調(diào)用時,待顯示的字符串必須以‘$’(24H)結束,而且字符串中不能含有控制碼,即ASCII字符值應是20H~7FH。待顯示字符串的段基址存放在DS寄存器中,串首的偏移地址存放在DX中。6.4DOS系統(tǒng)功能調(diào)用

例6.14

設程序PROG的運行密碼為qazwsx,在運行該程序前,提示輸入密碼。當密碼輸入正確時,運行該程序,否則輸出密碼錯誤信息,并提示是否繼續(xù)輸入?若輸入y,則返回密碼輸入,否則返回系統(tǒng),試編寫該程序。源程序如下:DATA SEGMENTMESS1 DB ‘PleaseInputPassword:’,0DH,0AH,‘$’;提示信息PASSWORD DB ‘qazwsx’ ;密碼MESS2 DB ‘PasswordIsError!’,0DH,0AH,‘$’;提示的錯誤信息MESS3 DB ‘Continue?yORn:’,0DH,0AH,‘$’ BUFFER DB 10,?,10DUP(?) ;輸入密碼緩沖區(qū)DATA ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATA

;賦段基址

MOV DS,AX MOV ES,AX

6.4DOS系統(tǒng)功能調(diào)用NEXT: MOV AX,SEGMESS1;顯示輸入密碼提示信息

MOV DS,AX MOV DX,OFFSETMESS1

MOV AH,09H INT 21H MOV AX,SEGBUFFER ;輸入密碼

MOV DS,AX MOV DX,OFFSETBUFFER MOV AH,0AH INT 21H CALL CRLF ;調(diào)用回車換行子程序

MOV CL,BUFFER+1 ;取實際輸入字符數(shù)

CMP CL,MESS2-PASSWORD;輸入密碼個數(shù)和原密 JZ CMPEV ;碼個數(shù)比較AGAIN: MOV AX,SEGMESS2 ;顯示密碼輸入錯誤

MOV DS,AX MOV DX,OFFSETMESS2

6.4DOS系統(tǒng)功能調(diào)用

MOV AH,09H INT 21H CALL CRLF ;調(diào)用回車換行子程序

MOV AX,SEGMESS3;顯示是否繼續(xù)輸入密碼

MOV DS,AX

MOV DX,OFFSETMESS3

MOV AH,09H INT 21H MOV AH,01H ;接收y或n INT 21H CMP AL,‘y’ ;是y,則繼續(xù)輸入密碼

JZ NEXT JMP EXIT ;不是,返回系統(tǒng)CMPEV: LEA SI,PASSWORD;輸入密碼和原密碼比較

LEA DI,BUFFER+2;輸入密碼首字符送DI MOV CX,MESS2-PASSWORD;密碼字符個數(shù)

6.4DOS系統(tǒng)功能調(diào)用

CLD ;DF=0 REPZ CMPSB ;串比較

JNZ AGAIN ;密碼不等轉AGAIN?

CALL PROG ;相等調(diào)用PROG程序EXIT: MOV AX,4C00H ;返回系統(tǒng)

INT 21HMAIN ENDPPROG PROC NEAR ;被執(zhí)行的程序(略) ┇ RETPROG ENDPCRLF PROC NEAR ;回車換行子程序

MOV DL,0DH MOV AH,02H INT 21H

MOV DL,0AH MOV AH,02H INT 21H

RETCRLF ENDP CODE ENDS END START6.4DOS系統(tǒng)功能調(diào)用6.4.3磁盤文件管理功能調(diào)用DOS系統(tǒng)有兩個自成系統(tǒng)的磁盤文件管理功能,一個是傳統(tǒng)的文件控制塊功能(FCBfunctions),另一個是高級的文件句柄功能(Handlefunctions)。前者是借助于在應用程序中定義的文件控制塊結構,與DOS的文件管理功能建立傳遞信息的接口。利用這個接口,應用程序既能建立、打開、關閉和刪除文件,也能存取該文件中任意位置和任意長度的記錄。但該功能使用繁瑣,已逐漸被后者所取代。后者卻是通過一個以零結尾的ASCII碼串傳遞給DOS。該串指出了待建立或打開文件的路徑名、文件名和擴展名。如果文件建立或打開操作成功,則DOS返回給應用程序一個文件句柄。其后,只要不對該文件實施關閉或刪除操作,那么,任何時候應用程序都可利用該文件句柄,對相應的文件進行任意位置上任意字節(jié)長度的存取。本節(jié)只介紹文件句柄功能1.文件句柄相關概念1)文件字符串在文件建立、打開、刪除或修改文件屬性以及對文件樹型目錄操作時,DOS都要求應用程序以一個以零結尾的ASCII字符串指定文件,該字符串包括驅動器標識,路徑名、文件名及擴展名。路徑名之間允許用前斜杠\或后斜杠/作為分隔符。例如,定義一個樹型文件:

6.4DOS系統(tǒng)功能調(diào)用

FilenameDB‘C:\SYSTEM\COMMAND.COM’,0在接受ASCII字符串的功能調(diào)用中,都要求應用程序用DS:DX雙字指針指向該字符串變量的段基址和偏移地址,以告知DOS需要對指定的文件進行操作。2)文件句柄文件句柄是一個16位長度的二進制代碼,即代表一個已被打開文件的通道號。借助于這個句柄,文件一旦被DOS打開,應用程序只需憑借由DOS返回的句柄即可對文件內(nèi)容進行隨意存取。系統(tǒng)上電初始化時,已對字符I/O標準設備預定義了五個句柄,即這五個設備(標準輸入設備、標準輸出設備、標準錯誤設備、標準輔助設備和標準列表設備)不必再重新打開便可使用。表6.7給出了DOS預定義的五個句柄。6.4DOS系統(tǒng)功能調(diào)用

3)返回錯誤代碼通常,對文件句柄功能的調(diào)用只要符合調(diào)用格式,且確保有足夠容量的內(nèi)存緩沖區(qū)和相應的磁盤空間,操作往往是成功的,此時總以進位標志位CF=0返回。一旦操作失敗,則CF=1且在AX中返回錯誤代碼。錯誤代碼與錯誤類型對照如表6.8所示。

4)文件屬性文件屬性是用一個字節(jié)的低6位來描述的,各位為1時含義如下:

6.4DOS系統(tǒng)功能調(diào)用D0:只讀文件;D1:隱藏文件;D2:系統(tǒng)文件;D3:卷標;D4:子目錄;D5:歸檔;當字節(jié)置0時,為普通文件。2.系統(tǒng)功能調(diào)用DOS文件句柄的管理子功能總共有20種之多。它們分別用于文件的建立、打開、關閉和刪除以及記錄的存取、目錄的檢索等操作。本節(jié)介紹與文件讀寫有關的幾種功能調(diào)用,表6.9給出了與文件讀寫有關的幾種功能調(diào)用的格式與作用。6

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論