已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章 输入输出程序设计 CPUMEM I/O设备 总线 I/O接口 1 查询方式 (程序控制方式) 中断方式 DMA方式 (直接存储器存取方式/成组传送方式) 1. I/O 设备的数据传送方式 2 I/O 指令是主机与外设进行通信的最基本途径 。DOS 功能调用和BIOS例行程序中的输入/输出 功能也是由IN和OUT指令完成的。 例:循环测试某状态寄存器的第2位是否为1 AGAIN: IN AL, STATUS_PORT TEST AL, 00000100B JZ AGAIN 2. 程序直接控制 I/O 方式 读I/O状态 准备好 ? 传送数据 N Y IN AL,DATA_PORT 3 I/O 指令是主机与外设进行通信的最基本途径 。DOS 功能调用和BIOS例行程序中的输入/输出 功能也是由IN和OUT指令完成的。 例:循环测试某状态寄存器的第2位是否为1 AGAIN: IN AL, STATUS_PORT TEST AL, 00000100B JZ AGAIN 2. 程序直接控制 I/O 方式 读I/O状态 准备好? 传送数据 N Y MOV AL, DATA OUT DATA_PORT, AL 4 轮流查询几种I/O设备: DEV1: INAL, STAT1 TESTAL, STAT1_BIT JZDEV2 CALLFAR PTR PROC1 DEV2: INAL, STAT2 TESTAL, STAT2_BIT JZDEV3 CALLFAR PTR PROC2 DEV3: INAL, STAT3 TESTAL, STAT3_BIT JZDEV1 CALLFAR PTR PROC3 优:程序安排或修改 设备的优先次序 缺:查询等待浪费 CPU大量有效时间 5 设备控制寄存器( 61h ) 1/0 0 控制其它外部设备 与门 放大器 2号定时器门控 1 0 例:Sound 程序1 mov dx, 100 in al, 61h and al, 11111100b sound: xor al, 2 out 61h, al mov cx, 140h wait1: loop wait1 dec dx jne sound 6 .model tiny .code .startup call speaker_on mov ah, 1 int 21h call speaker_off .exit 0 speaker_on proc push ax in al, 61h or al, 3 out 61h, al pop ax ret speaker_on endp speaker_off proc push ax in al, 61h and al, 0fch out 61h, al pop ax ret speaker_off endp end 例:Sound 程序2 7 print proc near push ax push dx mov dx, 378h ; 数据寄存器 out dx, al mov dx, 379h ; 状态寄存器 again: in al, dx test al, 80h ; (dx)7 = busy je again ; =0,打印机忙 mov dx, 37ah ; 控制寄存器 mov al, 0dh out dx, al ; 送选通信号 jmp $+2 ; 展宽选通信号 mov al, 0ch out dx, al pop dx pop ax ret print endp 例:打印机查询输出子程序 0 0 0 0 1 1 0 1 选通位 自动换行初 始 化 选 择 位 中 断 位 37AH 8 中断源:引起中断的事件 外中断(硬中断): 外设的 I/O 请求 可屏蔽中断 电源掉电 / 奇偶错 非屏蔽中断 内中断(软中断): INT 指令 / CPU 错(除法错、溢出)/ 为调试程序设置的中断 3. 中断传送方式 9 非屏蔽中断请求 中断逻辑 INT nINTO除法错单步 n 4 0 1 CPU 2 NMI 8259A 可编程中断控制器 (PIC) IR0 系统定时器 IR1 键盘 IR2 彩色/图形接口 IR3 保留 IR4 串行通讯口 IR5 保留 IR6 软盘 IR7 打印机 INTR 08 09 0A 0B 0C 0D 0E 0F 80x86 中断源: 10 设置CPU中断允许位: FLAGS 中的 IF 位 = 1 允许中断 ( STI ) = 0 禁止中断 ( CLI ) 设置中断屏蔽位: 中断屏蔽寄存器的中断屏蔽位 = 0 允许I/O设备请求中断 = 1 禁止I/O设备请求中断 7 6 5 4 3 2 1 0 定时器 键 盘 打印机 中断屏蔽寄存器21H 7 6 5 4 3 2 1 0 中断命令寄存器20H EOI MOV AL, 20H OUT 20H, AL 8259A 中断的条件: IN AL, 21H AND AL,0FDH OUT 21H,AL 11 类型0的(IP) 类型0的(CS) 类型1的(IP) 类型1的(CS) 类型N的(IP) 类型N的(CS) 类型255的(IP) 类型255的(CS) 00000 00004 4*N 003FC 中断向量中断处理程序的入口 地址(段址):(偏址) 中断向量表 用户可利用保留的中断类型号 扩充自己需要的中断功能。 12 CPU中断过程: (1)取中断类型:CPU type N (2)保护现场:FLAGS、CS、IP入栈 (3)IF=0, TF=0 (4)取中断向量:(4N) IP (4N2) CS (5)转中断处理程序 13 例:为中断类型 N 设置中断向量 MOV AX, 0 MOV ES, AX MOV BX, N*4 MOV AX, OFFSET INTHAND MOV ES: WORD PTRBX, AX ;偏移地址(N*4) MOV AX, SEG INTHAND MOV ES: WORD PTRBX+2,AX ;段地址(N*4+2) INTHAND: ;中断处理程序 IRET 14 DOS 功能调用(21H)存取中断向量: 设置中断向量: AH = 25H AL = 中断类型号 DS : DX = 中断向量 INT 21H 取中断向量: AH = 35H AL = 中断类型号 INT 21H 返回时送 ES : BX = 中断向量 15 MOV AL, N MOV AH, 35H INT 21H ; 取原中断向量 PUSH ES PUSH BX ; 保存原中断向量 PUSH DS MOV AX, SEG INTHAND MOV DS, AX MOV DX, OFFSET INTHAND MOV AL, N MOV AH, 25H INT 21H ; 设置新的中断向量 POP DS POP DX POP DS MOV AL, N MOV AH, 25H INT 21H ; 恢复原中断向量 INTHAND: ; 中断处理程序 IRET 例:用 DOS 功能调用存取中断向量 16 中断程序的编写步骤: 主程序: (1) 设置中断向量 (2) 设置 CPU 的中断允许位 IF (3) 设置设备的中断屏蔽位 中断处理子程序: (1) 保存寄存器内容 (2) 如允许中断嵌套,则开中断 ( STI ) (3) 中断处理功能 (4) 关中断 (5) 送中断结束命令( EOI )给中断命令寄存器 (6) 恢复寄存器内容 (7) IRET中断返回 17 例: 编写一个中断处理程序,要求在主程序运行期间, 每隔 10秒响铃一次,同时显示 bell 定时器 中断 18.2次/SEC ; INT_TIMER INT 1CH IRET INT_1CH PROC IRET INT_ICH ENDP RING PROC 1.计数182(10秒) 2.显示字符串 IRET RING ENDP 18 例:编写一个中断处理程序,要求在主程序运行期间, 每隔 10 秒响铃一次,并显示 bell .model small .stack .data cnt dw 1 mes db bell,0ah,0dh,$ .code main proc far start: mov ax, data mov ds, ax mov al, 1ch mov ah, 35h int 21h push es push bx push ds mov dx, offset ring mov ax, seg ring mov ds, ax mov al, 1ch mov ah, 25h int 21h pop ds in al, 21h and al, 11111110b out 21h, al sti 19 mov di, 30000 dly: mov si, 60000 dly1: dec si jnz dly1 dec di jnz dly ;主程序 pop dx pop ds mov al, 1ch mov ah, 25h int 21h mov ax, 4c00h int 21h main endp ring proc near ;保存寄存器 mov ax, data mov ds, ax sti ;开中断 dec cnt jnz exit mov dx, offset mes mov ah, 09 int 21h call sound mov cnt,182 exit: cli ;关中断 ;恢复寄存器 iret ring endp end start 20 例:键盘模拟程序 字符码:采用ASCII 码表示字母、数字、专用字符和一些 非打印字符,键盘上的控制键和功能键的ASCII 码为0,必须用扫描码来识别。 扫描码:键盘上的每个键都对应一个扫描码,扫描码是按 键的位置来排列的。 data segment scatab db 0,0,1234567890-=,8,0 db qwertyuiop,0dh,0 db asdfghjkl;,0,0,0,0 db zxcvbnm,./,0,0,0 db ,0,0,0,0,0,0,0,0,0,0,0,0,0 db 789-456+1230,0 data ends 21 main proc far lea bx, scatab key_in: in al, 60h test al, 80h ;通码? jnz key_in push ax in al, 61h or al, 80h ;置应答位 out 61h, al and al, 7fh out 61h, al;复位应答位 pop ax cmp al, 01 jz exit ;按Esc退出 xlatb cmp al, 0 jz no_disp call disp_char no_disp: jmp key_in exit: main endp disp_char proc near mov ah, 2 mov dl, al int 21h ret disp_char endp 7 6 5 4 3 2 1 0 设备控制寄存器 61H 键盘 22 例:从键盘接收字符,同时对32字节的输入缓冲区进行 测试;如缓冲区已满,将键盘挂起,由打印机输出 一个提示信息 MAIN BUFFER满 CALL CALL IRET N KBD 中断 32次 TYP 中断 17次 KBINT IRET PRINT RET DISP RET INTIP 23 例:从键盘接收字符,同时对32字节的输入缓冲区进行 测试;如缓冲区已满,将键盘挂起,由打印机输出 一个提示信息 程序包括以下几个部分: main 初始化部分 kbint 键盘中断处理程序 intip 初始化打印机 prtint 打印机中断处理程序 disp 用十六进制显示al中的内容 24 dseg segment addr dw ? ;缓冲区指针 count dw ? buffer db 20h dup ( ) prompt db please input:,0dh,0ah,$ message db buffer overflow,0dh,0ah save_ip9 dw ? save_cs9 dw ? save_ipf dw ? save_csf dw ? dseg ends main proc far mov addr, offset buffer mov count, 0 25 mov al, 09 ;键盘 mov ah, 35h int 21h mov save_ip9, bx mov save_cs9, es mov dx, offset kbint push ds mov ax, seg kbint mov ds, ax mov al, 09 mov ah, 25h int 21h pop ds in al, 21h and al, 0fdh out 21h, al mov al, 0fh ;打印机 mov ah, 35h int 21h mov save_ipf, bx mov save_csf, es mov dx, offset prtint push ds mov ax, seg prtint mov ds, ax mov al, 0fh mov ah, 25h int 21h pop ds mov ah, 9 lea dx, prompt int 21h 26 sti mov di, 8000h dly: mov si, 9000h dly1: dec si jnz dly1 dec di jnz dly mov ah, 2 mov dl, $ int 21h cli push ds mov dx, save_ip9 mov ax, save_cs9 mov ds, ax mov al, 09 mov ah, 25h int 21h pop ds push ds mov dx, save_ipf mov ax, save_csf mov ds, ax mov al, 0fh mov ah, 25h int 21h pop ds in al, 21h and al, 0fdh out 21h, al sti main endp 27 kbint proc near push ax push bx in al, 60h push ax in al, 61h mov ah, al or al, 80h out 61h, al ;送键盘应答信号 xchg ah, al out 61h, al ;复位键盘 pop ax test al, 80h jnz ret1 ;通码时处理 通码:(60h)7=0 断码:(60h)7=1 mov bx, addr mov bx, al call disp inc bx inc count mov addr, bx check: cmp count,32 jb ret1 ;判断是否溢出 in al, 21h or al, 02 ;屏蔽键盘中断 and al, 7fh out 21h,al ;允许打印机中断 call intip ret1: cli mov al, 20h out 20h,al ;结束键盘中断 pop bx pop ax iret kbint endp 28 intip proc near push ax push bx 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, al
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司委托经营协议书
- 2026-2031中国光学传感器行业市场调研与投资战略研究报告
- 2026-2031中国灌装机市场调研及投资前景评估
- 法条体系的结构化解释
- 2025年跨境电商市场拓展与渠道建设专项试卷及答案
- 居家老年人健康管理专项技能培训题库及答案
- 公共场所场所危害健康事故应急处理预案
- 2025福建事业单位工勤人员考试档案管理员训练题及答案
- 2026-2031中国泡沫镍发展现状与市场前景分析
- 2026年建筑材料检验检测合同
- 2025年电工职业技能鉴定试卷(初级工)实操试题及答案解析
- 小学生心理健康教育课程的设计与实施研究
- 2025秋人教版八年级上册英语试卷 Unit 6 单元考试试卷【原卷+听力音频+听力原文+答案】
- 4.2 用方向与距离确定物体的位置 课件 浙教版八年级上册
- 电梯安装技术交底
- 市场分析与定位信息表格
- 菌种管理规定
- 2025年中考数学真题知识点分类汇编之整式(一)
- 感染性心内膜炎诊疗指南
- 口腔医学技术专业职业规划
- 物流公司整改报告物流公司安全整改报告2025
评论
0/150
提交评论