版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第 8 章 輸入輸出程序設計,2,1. I/O 設備的數(shù)據(jù)傳送方式,程序直接控制方式中斷方式直接存儲器存取 (DMA)方式,3,I/O 指令是主機與外設進行通信的最基本途徑。DOS 功能調用和BIOS例行程序中的輸入/輸出功能也是由IN和OUT指令完成的。例:循環(huán)測試某狀態(tài)寄存器的第2位是否為1,2. 程序直接控制方式,AGAIN: IN AL, STATUS_PORT TEST AL,
2、00000100B JZ AGAIN,MOV AL, DATAOUT DATA_PORT, AL,IN AL,DATA_PORT,4,輪流查詢幾種I/O設備:DEV1:INAL, STAT1TESTAL, STAT1_BITJZDEV2CALLFAR PTR PROC1DEV2: INAL, STAT2TESTAL, STAT2_BITJZDEV3CALL
3、FAR PTR PROC2DEV3: INAL, STAT3TESTAL, STAT3_BITJZDEV1CALLFAR PTR PROC3,優(yōu):程序安排或修改 設備的優(yōu)先次序缺:查詢等待浪費CPU大量有效時間,5,,例:Sound 程序1,…… mov dx, 100 in al, 61h and al, 11111100bsound:
4、 xor al, 2 out 61h, al mov cx, 140hwait1: loop wait1 dec dx jne sound ……,6,.model tiny.code.startupcall speaker_onmov ah, 1int 21hcall speaker_off.exit 0,spe
5、aker_on proc push ax in al, 61h or al, 3 out 61h, al pop ax retspeaker_on endp speaker_off proc push ax in al, 61h and al, 0fch out 61h, al pop ax re
6、tspeaker_off endpend,例:Sound 程序2,,,7,print proc near push ax push dx mov dx, 378h ; 數(shù)據(jù)寄存器 out dx, al mov dx, 379h ; 狀態(tài)寄存器again: in al, dx
7、 test al, 80h ; (dx)7 = busy je again ; =0,打印機忙 mov dx, 37ah ; 控制寄存器 mov al, 0dh out dx, al ; 送選通信號 jmp $+2 ; 展寬選通信號 mov
8、 al, 0ch out dx, al pop dx pop ax retprint endp,例:打印機查詢輸出子程序,0 0 0 0 1 1 0 1,,選通位,自動換行,初始化,選擇位,中斷位,,,,,,,,,,37AH,8,中斷源:引起中斷的事件外中斷(硬中斷): 外設的 I/O 請求 —— 可屏蔽中斷 電源掉
9、電 / 奇偶錯 —— 非屏蔽中斷內中斷(軟中斷): INT 指令 / CPU 錯(除法錯、溢出)/ 為調試程序設置的中斷,3. 中斷傳送方式,80x86 中斷源,9,設置CPU中斷允許位:FLAGS 中的 IF 位 = 1 允許中斷 ( STI ) = 0 禁止中斷 ( CLI )設置中斷屏蔽位:中斷屏蔽寄存器的中斷屏蔽位
10、= 0 允許 I/O 設備請求中斷 = 1 禁止 I/O 設備請求中斷,中斷的條件:,IN AL, 21HAND AL,0FDH OUT 21H,AL,10,中斷向量 — 中斷處理程序的入口地址 (段址):(偏址),中斷向量表,用戶可利用保留的中斷類型號擴充自己需要的中斷功能。,CPU中斷過程:(1)取中斷類型:CPU ← type
11、N(2)保護現(xiàn)場:FLAGS、CS、IP入棧(3)IF=0, TF=0(4)取中斷向量:(4×N)→ IP (4×N+2)→ CS(5)轉中斷處理程序,11,例:為中斷類型 N 設置中斷向量 …… MOV AX, 0 MOV ES, AX MOV BX, N*4 MOV AX, OFFSET INTHAND MOV ES: WORD PTR[
12、BX], AX ;偏移地址?(N*4) MOV AX, SEG INTHAND MOV ES: WORD PTR[BX+2],AX ;段地址?(N*4+2) …… INTHAND: ;中斷處理程序 …… IRET,,12
13、,DOS 功能調用(21H)存取中斷向量:設置中斷向量:AH = 25HAL = 中斷類型號DS : DX = 中斷向量INT 21H取中斷向量:AH = 35HAL = 中斷類型號INT 21H返回時送 ES : BX = 中斷向量,13,MOV AL, NMOV AH, 35HINT 21H ; 取原中斷向量PUSH ESPUSH BX
14、 ; 保存原中斷向量PUSH DSMOV AX, SEG INTHANDMOV DS, AX MOV DX, OFFSET INTHANDMOV AL, NMOV AH, 25HINT 21H ; 設置新的中斷向量 POP DS……POP DXPOP DSMOV AL, NMOV AH, 25HINT 21H
15、 ; 恢復原中斷向量……INTHAND: ; 中斷處理程序……IRET,例:用 DOS 功能調用存取中斷向量,14,中斷程序的編寫步驟:主程序:設置中斷向量設置 CPU 的中斷允許位 IF設置設備的中斷屏蔽位中斷處理子程序:保存寄存器內容如允許中斷嵌套,則開中斷 ( STI )中斷處理功能關中斷送中斷結束命令( EOI )給中斷命令寄存器恢復寄存器內容IRET
16、中斷返回,15,例: 編寫一個中斷處理程序,要求在主程序運行期間, 每隔 10秒響鈴一次,同時顯示‘ bell ’。,,,定時器 中斷18.2次/SEC,; INT_TIMER ∶ ∶ INT 1CH ∶ ∶ IRET,,,,INT_1CH PROC IRET INT_ICH ENDP,,RING PROC1
17、.計數(shù)182(10秒)2.顯示字符串 IRETRING ENDP,,,16,例:編寫一個中斷處理程序,要求在主程序運行期間, 每隔 10 秒響鈴一次,并顯示 ‘bell’,.model small.stack.datacnt dw 1mes db 'bell',0ah,0dh,'$' .codemain proc farstart: mo
18、v ax, @data mov ds, ax,mov al, 1chmov ah, 35hint 21hpush espush bxpush dsmov dx, offset ringmov ax, seg ringmov ds, axmov al, 1chmov ah, 25hint 21hpop ds in
19、al, 21hand al, 11111110bout 21h, alsti,,17,mov di, 30000dly: mov si, 60000dly1: dec si jnz dly1 dec di jnz dly ;主程序 pop dx pop ds mov al, 1
20、ch mov ah, 25h int 21h mov ax, 4c00h int 21hmain endp,,18,例:鍵盤模擬程序,字符碼:采用ASCII 碼表示字母、數(shù)字、專用字符和一些 非打印字符,鍵盤上的控制鍵和功能鍵的ASCII 碼為0,必須用掃描碼來識別。掃描碼:鍵盤上的每個鍵都對應一個掃描
21、碼,掃描碼是按 鍵的位置來排列的。data segment scatab db 0,0,'1234567890-=',8,0 db 'qwertyuiop[]',0dh,0 db 'asdfghjkl;',0,0,0,0 db 'zxcvbnm,.
22、/',0,0,0 db ' ',0,0,0,0,0,0,0,0,0,0,0,0,0 db '789-456+1230',0data ends,19,20,例:從鍵盤接收字符,同時對32字節(jié)的輸入緩沖區(qū)進行 測試;如緩沖區(qū)已滿,將鍵盤掛起,由打印機輸出 一個提示信息,,,,,,,,,MAIN,,,BU
23、FFER滿 CALL CALL IRET,,,,N,,,,,,,,,KBD中斷32次,TYP中斷17次,KBINT,,,IRET,,,PRINT,,,,,RET,,,,,DISP,,,,,RET,,,,,INTIP,,,,,,21,例:從鍵盤接收字符,同時對32字節(jié)的輸入緩沖區(qū)進行 測試;如緩沖區(qū)已滿,將鍵盤掛起,由打印機輸出 一個提示信息 程序包括以下幾個部分:
24、main 初始化部分kbint 鍵盤中斷處理程序intip 初始化打印機prtint 打印機中斷處理程序disp 用十六進制顯示al中的內容,22,dseg segment addr dw ? ;緩沖區(qū)指針 count dw ? buffer db 20h dup (' ') prompt
25、 db 'please input:',0dh,0ah,'$' message db 'buffer overflow',0dh,0ah save_ip9 dw ? save_cs9 dw ? save_ipf dw ? save_csf dw ?dseg endsmain pro
26、c far …… mov addr, offset buffer mov count, 0,23,mov al, 09 ;鍵盤mov ah, 35hint 21h mov save_ip9, bxmov save_cs9, es mov dx, offset kbintpush dsmov ax, seg kbintm
27、ov ds, axmov al, 09mov ah, 25hint 21h pop ds in al, 21hand al, 0fdhout 21h, al,,24,25,kbint proc near push ax push bx in al, 60h push ax in al, 61h mov ah, al or
28、 al, 80h out 61h, al ;送鍵盤應答信號 xchg ah, al out 61h, al ;復位鍵盤 pop ax test al, 80h jnz ret1 ;通碼時處理,26,intip proc near push ax push bx
29、 push dx cli mov bx, offset message mov addr, bx mov dx, 378h mov al, 0dh out dx, al ;輸出回車 mov dx, 37ah mov al, 1dh out dx, a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論