汇编语言程序设计 第8章

上传人:ji****72 文档编号:48553683 上传时间:2018-07-17 格式:PPT 页数:32 大小:202KB
返回 下载 相关 举报
汇编语言程序设计 第8章_第1页
第1页 / 共32页
汇编语言程序设计 第8章_第2页
第2页 / 共32页
汇编语言程序设计 第8章_第3页
第3页 / 共32页
汇编语言程序设计 第8章_第4页
第4页 / 共32页
汇编语言程序设计 第8章_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《汇编语言程序设计 第8章》由会员分享,可在线阅读,更多相关《汇编语言程序设计 第8章(32页珍藏版)》请在金锄头文库上搜索。

1、第八章 输入输出程序设计CPUMEMI/O设备总线I/O接口1查询方式 (程序控制方式)中断方式DMA方式(直接存储器存取方式/成组传送方式)1. I/O 设备的数据传送方式2I/O 指令是主机与外设进行通信的最基本途径 。DOS 功能调用和BIOS例行程序中的输入/输出 功能也是由IN和OUT指令完成的。例:循环测试某状态寄存器的第2位是否为1AGAIN: IN AL, STATUS_PORTTEST AL, 00000100BJZ AGAIN2. 程序直接控制 I/O 方式读I/O状态准备好 ?传送数据NYIN AL,DATA_PORT 3I/O 指令是主机与外设进行通信的最基本途径 。D

2、OS 功能调用和BIOS例行程序中的输入/输出 功能也是由IN和OUT指令完成的。例:循环测试某状态寄存器的第2位是否为1AGAIN: IN AL, STATUS_PORTTEST AL, 00000100BJZ AGAIN2. 程序直接控制 I/O 方式读I/O状态准备好?传送数据NYMOV AL, DATA OUT DATA_PORT, AL4轮流查询几种I/O设备:DEV1: INAL, STAT1TESTAL, STAT1_BITJZDEV2CALLFAR PTR PROC1DEV2: INAL, STAT2TESTAL, STAT2_BITJZDEV3CALLFAR PTR PROC

3、2DEV3: INAL, STAT3TESTAL, STAT3_BITJZDEV1CALLFAR PTR PROC3优:程序安排或修改 设备的优先次序缺:查询等待浪费 CPU大量有效时间5设备控制寄存器( 61h )1/0 0控制其它外部设备与门放大器2号定时器门控1 0例:Sound 程序1mov dx, 100in al, 61hand al, 11111100b sound: xor al, 2out 61h, almov cx, 140h wait1: loop wait1dec dxjne sound6.model tiny .code .startup call speaker_o

4、n mov ah, 1 int 21h call speaker_off .exit 0speaker_on procpush axin al, 61hor al, 3 out 61h, alpop axret speaker_on endpspeaker_off procpush axin al, 61hand al, 0fchout 61h, alpop axret speaker_off endpend例:Sound 程序27print proc nearpush axpush dxmov dx, 378h ; 数据寄存器out dx, al mov dx, 379h ; 状态寄存器 a

5、gain: in al, dxtest al, 80h ; (dx)7 = busyje again ; =0,打印机忙mov dx, 37ah ; 控制寄存器mov al, 0dhout dx, al ; 送选通信号jmp $+2 ; 展宽选通信号mov al, 0chout dx, alpop op axret print endp例:打印机查询输出子程序0 0 0 0 1 1 0 1选通位 自动换行初 始 化选 择 位中 断 位37AH8中断源:引起中断的事件外中断(硬中断):外设的 I/O 请求 可屏蔽中断电源掉电 / 奇偶错 非屏蔽中断内中断(软中断):INT 指令 / CPU 错(

6、除法错、溢出)/ 为调试程序设置的中断3. 中断传送方式9非屏蔽中断请求中断逻辑INT nINTO除法错单步n 4 0 1CPU2 NMI8259A可编程中断控制器(PIC)IR0 系统定时器IR1 键盘 IR2 彩色/图形接口 IR3 保留 IR4 串行通讯口 IR5 保留 IR6 软盘IR7 打印机INTR08090A0B0C0D0E0F80x86 中断源:10设置CPU中断允许位:FLAGS 中的 IF 位 = 1 允许中断 ( STI )= 0 禁止中断 ( CLI ) 设置中断屏蔽位:中断屏蔽寄存器的中断屏蔽位 = 0 允许I/O设备请求中断 = 1 禁止I/O设备请求中断7 6 5

7、 4 3 2 1 0定时器键 盘 打印机中断屏蔽寄存器21H7 6 5 4 3 2 1 0 中断命令寄存器20HEOIMOV AL, 20HOUT 20H, AL8259A中断的条件:IN AL, 21HAND AL,0FDH OUT 21H,AL11类型0的(IP)类型0的(CS)类型1的(IP)类型1的(CS)类型N的(IP)类型N的(CS)类型255的(IP)类型255的(CS)00000000044*N003FC中断向量中断处理程序的入口地址(段址):(偏址)中断向量表用户可利用保留的中断类型号 扩充自己需要的中断功能。12CPU中断过程:(1)取中断类型:CPU type N(2)保

8、护现场:FLAGS、CS、IP入栈(3)IF=0, TF=0(4)取中断向量:(4N) IP(4N2) CS(5)转中断处理程序13例:为中断类型 N 设置中断向量MOV AX, 0MOV ES, AXMOV BX, N*4MOV AX, OFFSET INTHANDMOV ES: WORD PTRBX, AX ;偏移地址(N*4)MOV AX, SEG INTHANDMOV ES: WORD PTRBX+2,AX ;段地址(N*4+2)INTHAND: ;中断处理程序IRET14DOS 功能调用(21H)存取中断向量:设置中断向量: AH = 25H AL = 中断类型号 DS : DX =

9、 中断向量 INT 21H取中断向量: AH = 35H AL = 中断类型号 INT 21H 返回时送 ES : BX = 中断向量15MOV 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 ; 恢复原中断向量 IN

10、THAND: ; 中断处理程序 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_TIMERINT 1CHI

11、RETINT_1CH PROCIRETINT_ICH ENDPRING PROC1.计数182(10秒)2.显示字符串IRETRING ENDP18例:编写一个中断处理程序,要求在主程序运行期间,每隔 10 秒响铃一次,并显示 bell.model small .stack .datacnt dw 1 mes db bell,0ah,0dh,$.codemain proc far start:mov ax, datamov ds, ax mov al, 1ch mov ah, 35h int 21h push es push bxpush ds mov dx, offset ring mov

12、ax, seg ring mov ds, ax mov al, 1ch mov ah, 25h int 21h pop dsin al, 21h and al, 11111110b out 21h, al sti19mov di, 30000 dly: mov si, 60000 dly1:dec sijnz dly1dec dijnz dly ;主程序pop op dsmov al, 1chmov ah, 25hint 21h mov ax, 4c00hint 21hmain endp ring proc near ;保存寄存器mov ax, datamov ds, axsti ;开中断de

13、c cntjnz exitmov dx, offset mesmov ah, 09int 21hcall soundmov cnt,182 exit: cli ;关中断 ;恢复寄存器iret ring endpend start20例:键盘模拟程序字符码:采用ASCII 码表示字母、数字、专用字符和一些非打印字符,键盘上的控制键和功能键的ASCII码为0,必须用扫描码来识别。扫描码:键盘上的每个键都对应一个扫描码,扫描码是按键的位置来排列的。data segmentscatab db 0,0,1234567890-=,8,0db qwertyuiop,0dh,0db asdfghjkl;,0,0,0,0db zxcvbnm,./,0,0,0db ,0,0,0,0,0,0,0,0,0,0,0,0,0db 789-456+1230,0 data ends21main proc farlea bx, scatab key_in: in al, 60h test al, 80h ;通码?jnz key_inpush axin al, 61hor al, 80h ;置应答位out 61h, aland al, 7fhout 61h, al;复位应答位pop axcmp al, 01jz exit ;按Esc退出xlatbcmp al, 0jz no_dispcall

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号