版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第 8 章 輸入輸出程序設(shè)計(jì),2,1. I/O 設(shè)備的數(shù)據(jù)傳送方式,程序直接控制方式中斷方式直接存儲(chǔ)器存取 (DMA)方式,3,I/O 指令是主機(jī)與外設(shè)進(jìn)行通信的最基本途徑。DOS 功能調(diào)用和BIOS例行程序中的輸入/輸出功能也是由IN和OUT指令完成的。例:循環(huán)測(cè)試某狀態(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設(shè)備:DEV1:INAL, STAT1TESTAL, STAT1_BITJZDEV2CALLFAR PTR PROC1DEV2: INAL, STAT2TESTAL, STAT2_BITJZDEV3CALL
3、FAR PTR PROC2DEV3: INAL, STAT3TESTAL, STAT3_BITJZDEV1CALLFAR PTR PROC3,優(yōu):程序安排或修改 設(shè)備的優(yōu)先次序缺:查詢等待浪費(fèi)CPU大量有效時(shí)間,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,打印機(jī)忙 mov dx, 37ah ; 控制寄存器 mov al, 0dh out dx, al ; 送選通信號(hào) jmp $+2 ; 展寬選通信號(hào) mov
8、 al, 0ch out dx, al pop dx pop ax retprint endp,例:打印機(jī)查詢輸出子程序,0 0 0 0 1 1 0 1,,選通位,自動(dòng)換行,初始化,選擇位,中斷位,,,,,,,,,,37AH,8,中斷源:引起中斷的事件外中斷(硬中斷): 外設(shè)的 I/O 請(qǐng)求 —— 可屏蔽中斷 電源掉
9、電 / 奇偶錯(cuò) —— 非屏蔽中斷內(nèi)中斷(軟中斷): INT 指令 / CPU 錯(cuò)(除法錯(cuò)、溢出)/ 為調(diào)試程序設(shè)置的中斷,3. 中斷傳送方式,80x86 中斷源,9,設(shè)置CPU中斷允許位:FLAGS 中的 IF 位 = 1 允許中斷 ( STI ) = 0 禁止中斷 ( CLI )設(shè)置中斷屏蔽位:中斷屏蔽寄存器的中斷屏蔽位
10、= 0 允許 I/O 設(shè)備請(qǐng)求中斷 = 1 禁止 I/O 設(shè)備請(qǐng)求中斷,中斷的條件:,IN AL, 21HAND AL,0FDH OUT 21H,AL,10,中斷向量 — 中斷處理程序的入口地址 (段址):(偏址),中斷向量表,用戶可利用保留的中斷類型號(hào)擴(kuò)充自己需要的中斷功能。,CPU中斷過程:(1)取中斷類型:CPU ← type
11、N(2)保護(hù)現(xiàn)場(chǎng):FLAGS、CS、IP入棧(3)IF=0, TF=0(4)取中斷向量:(4×N)→ IP (4×N+2)→ CS(5)轉(zhuǎn)中斷處理程序,11,例:為中斷類型 N 設(shè)置中斷向量 …… 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 功能調(diào)用(21H)存取中斷向量:設(shè)置中斷向量:AH = 25HAL = 中斷類型號(hào)DS : DX = 中斷向量INT 21H取中斷向量:AH = 35HAL = 中斷類型號(hào)INT 21H返回時(shí)送 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 ; 設(shè)置新的中斷向量 POP DS……POP DXPOP DSMOV AL, NMOV AH, 25HINT 21H
15、 ; 恢復(fù)原中斷向量……INTHAND: ; 中斷處理程序……IRET,例:用 DOS 功能調(diào)用存取中斷向量,14,中斷程序的編寫步驟:主程序:設(shè)置中斷向量設(shè)置 CPU 的中斷允許位 IF設(shè)置設(shè)備的中斷屏蔽位中斷處理子程序:保存寄存器內(nèi)容如允許中斷嵌套,則開中斷 ( STI )中斷處理功能關(guān)中斷送中斷結(jié)束命令( EOI )給中斷命令寄存器恢復(fù)寄存器內(nèi)容IRET
16、中斷返回,15,例: 編寫一個(gè)中斷處理程序,要求在主程序運(yùn)行期間, 每隔 10秒響鈴一次,同時(shí)顯示‘ bell ’。,,,定時(shí)器 中斷18.2次/SEC,; INT_TIMER ∶ ∶ INT 1CH ∶ ∶ IRET,,,,INT_1CH PROC IRET INT_ICH ENDP,,RING PROC1
17、.計(jì)數(shù)182(10秒)2.顯示字符串 IRETRING ENDP,,,16,例:編寫一個(gè)中斷處理程序,要求在主程序運(yùn)行期間, 每隔 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,必須用掃描碼來識(shí)別。掃描碼:鍵盤上的每個(gè)鍵都對(duì)應(yīng)一個(gè)掃描
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,例:從鍵盤接收字符,同時(shí)對(duì)32字節(jié)的輸入緩沖區(qū)進(jìn)行 測(cè)試;如緩沖區(qū)已滿,將鍵盤掛起,由打印機(jī)輸出 一個(gè)提示信息,,,,,,,,,MAIN,,,BU
23、FFER滿 CALL CALL IRET,,,,N,,,,,,,,,KBD中斷32次,TYP中斷17次,KBINT,,,IRET,,,PRINT,,,,,RET,,,,,DISP,,,,,RET,,,,,INTIP,,,,,,21,例:從鍵盤接收字符,同時(shí)對(duì)32字節(jié)的輸入緩沖區(qū)進(jìn)行 測(cè)試;如緩沖區(qū)已滿,將鍵盤掛起,由打印機(jī)輸出 一個(gè)提示信息 程序包括以下幾個(gè)部分:
24、main 初始化部分kbint 鍵盤中斷處理程序intip 初始化打印機(jī)prtint 打印機(jī)中斷處理程序disp 用十六進(jìn)制顯示al中的內(nèi)容,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 ;送鍵盤應(yīng)答信號(hào) xchg ah, al out 61h, al ;復(fù)位鍵盤 pop ax test al, 80h jnz ret1 ;通碼時(shí)處理,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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
評(píng)論
0/150
提交評(píng)論