第八章输入输出程序设计

上传人:新** 文档编号:590478567 上传时间:2024-09-14 格式:PPT 页数:32 大小:267.03KB
返回 下载 相关 举报
第八章输入输出程序设计_第1页
第1页 / 共32页
第八章输入输出程序设计_第2页
第2页 / 共32页
第八章输入输出程序设计_第3页
第3页 / 共32页
第八章输入输出程序设计_第4页
第4页 / 共32页
第八章输入输出程序设计_第5页
第5页 / 共32页
点击查看更多>>
资源描述

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

1、汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计第八章第八章 输入输出程序设计输入输出程序设计CPUMEMI/O设备设备总线总线I/O接口接口汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计查询方式查询方式(程序控制方式程序控制方式)中断方式中断方式DMA方式方式(直接存储器存取方式直接存储器存取方式/ /成组传送方式成组传送方式)1. I/O 设备的数据传送方式设备的数据传送方式汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计 I/O 指指令令是是主主机机与与外外设设进进行行通通信信的的最最基基本本途途

2、径径。DOS 功功能能调调用用和和BIOS例例行行程程序序中中的的输输入入/ /输输出出功功能也是由能也是由IN和和OUT指令完成的。指令完成的。例:循环测试某例:循环测试某状态寄存器状态寄存器的第的第2位是否为位是否为1 AGAIN: AGAIN: IN AL, IN AL, STATUS_PORTSTATUS_PORT TEST AL, 00000100B TEST AL, 00000100B JZ AGAIN JZ AGAIN2. 程序直接控制程序直接控制 I/O 方式方式 读读I/O状态状态准备好准备好? 传送数据传送数据NYIN AL,DATA_PORTIN AL,DATA_PORT

3、 I/O 指指令令是是主主机机与与外外设设进进行行通通信信的的最最基基本本途途径径。DOS 功功能能调调用用和和BIOS例例行行程程序序中中的的输输入入/ /输输出出功功能也是由能也是由IN和和OUT指令完成的。指令完成的。例:循环测试某例:循环测试某状态寄存器状态寄存器的第的第2位是否为位是否为1 AGAIN: AGAIN: IN AL, IN AL, STATUS_PORTSTATUS_PORT TEST AL, 00000100B TEST AL, 00000100B JZ AGAIN JZ AGAIN 2. 程序直接控制程序直接控制 I/O 方式方式 读读I/O状态状态准备好?准备好?

4、 传送数据传送数据NYMOV AL, DATAMOV AL, DATAOUT DATA_PORT, ALOUT DATA_PORT, AL轮流查询几种轮流查询几种I/O设备:设备:DEV1: INAL, STAT1TESTAL, STAT1_BITJZDEV2CALLFAR PTR PROC1DEV2: INAL, STAT2TESTAL, STAT2_BITJZDEV3CALLFAR PTR PROC2DEV3: INAL, STAT3TESTAL, STAT3_BITJZDEV1CALLFAR PTR PROC3优:程序安排或修改设备的优先次序缺:查询等待浪费CPU大量有效时间汇编语言程序

5、设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计设备控制寄存器设备控制寄存器( 61h61h )1/0 01/0 0 控制其它外部设备控制其它外部设备与与门门放大器放大器2号定时器门控号定时器门控1 0例:例:Sound 程序程序1 movmov dxdx, 100, 100 in al, 61hin al, 61h and al, 11111100b and al, 11111100bsound: sound: xorxor al, 2 al, 2 out 61h, alout 61h, al movmov cxcx, 140h, 140hwait1: loop wait1

6、wait1: loop wait1 decdec dxdx jnejne sound sound 汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计.model tiny.code.startupcall speaker_onmov ah, 1int 21hcall speaker_off.exit 0speaker_on proc push ax in al, 61h or al, 3 out 61h, al pop ax retspeaker_on endpspeaker_off proc push ax in al, 61h and al, 0fch out

7、61h, al pop ax retspeaker_off endpend例:例:Sound 程序程序2print proc nearprint proc near push ax push ax push push dxdx movmov dxdx, , 378h378h ; ; 数据寄存器数据寄存器 out out dxdx, al , al movmov dxdx, , 379h 379h ; ; 状态寄存器状态寄存器again: in al, again: in al, dxdx test al, 80h ; test al, 80h ; (dx)7 7 = busy jeje aga

8、in again ; =0,; =0,打印机忙打印机忙 movmov dxdx, , 37ah 37ah ; ; 控制寄存器控制寄存器 movmov al, 0dh al, 0dh out out dxdx, al , al ; 送选通信号送选通信号 jmpjmp $+2 $+2 ; ; 展宽选通信号展宽选通信号 movmov al, 0ch al, 0ch out out dxdx, al, al pop pop dxdx pop ax pop ax ret retprint print endpendp例:打印机查询输出子程序例:打印机查询输出子程序00001101选通位自动换行初始化选择

9、位中断位37AH汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计中断源:中断源:引起中断的事件引起中断的事件外中断外中断(硬中断硬中断): 外设的外设的 I/O 请求请求 可屏蔽中断可屏蔽中断 电源掉电电源掉电 / 奇偶错奇偶错 非屏蔽中断非屏蔽中断内中断内中断(软中断软中断): INT 指令指令 / CPU 错(除法错、溢出)错(除法错、溢出)/ 为调试程序设置的中断为调试程序设置的中断3. 中断传送方式中断传送方式汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计非非屏蔽中断请求屏蔽中断请求中断逻辑中断逻辑INT nINTO除法错除

10、法错单步单步 n 4 0 1CPU 2 NMI8259A可可编编程程中中断断控控制制器器(PIC)IR0 系统定时器系统定时器IR1 键盘键盘IR2 彩色彩色/图形接口图形接口IR3 保留保留IR4 串行通讯口串行通讯口IR5 保留保留IR6 软盘软盘IR7 打印机打印机INTR08090A0B0C0D0E0F80x86 中断源:中断源:设置设置CPU中断允许位:中断允许位:FLAGS 中的中的 IF 位位 = 1 允许中断允许中断 ( STI ) = 0 禁止中断禁止中断 ( CLI )设置中断屏蔽位:设置中断屏蔽位: 中断屏蔽寄存器的中断屏蔽位中断屏蔽寄存器的中断屏蔽位 = 0 允许允许I

11、/O设备请求中断设备请求中断 = 1 禁止禁止I/O设备请求中断设备请求中断 7 6 5 4 3 2 1 0定定时时器器键键 盘盘 打打印印机机中断屏蔽寄存器中断屏蔽寄存器21H 7 6 5 4 3 2 1 0中断命令寄存器中断命令寄存器20H EOIMOV AL, 20HOUT 20H, AL8259A中断的条件:中断的条件:IN AL, 21HAND AL,0FDHOUT 21H,AL 类型类型0的的(IP) 类型类型0的的(CS) 类型类型1的的(IP) 类型类型1的的(CS) 类型类型N的的(IP) 类型类型N的的(CS) 类型类型255的的(IP) 类型类型255的的(CS)0000

12、000004 4*N003FC中断向量中断向量中断处理程序的入口中断处理程序的入口 地址(段址)地址(段址):(偏址)(偏址)中断向量表中断向量表用户可利用保留的中断类型号用户可利用保留的中断类型号扩充自己需要的中断功能。扩充自己需要的中断功能。汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计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 AX, 0 MOV ES, AX MOV ES, AX MOV BX, N*4 MOV BX, N*4 MOV AX, OFFSET MOV AX, OFFSET INTHANDINTHAND MOV ES: WORD PTRBX, AX MOV ES: WORD PTRBX, AX ;偏移地址(N*4) MOV AX, SEG MOV AX, SEG INTHANDINTHAND MOV ES: WORD PTRBX+2,AX MOV ES: WORD PTRBX+2,AX ;段地址(N*4+2) INTHAND: IN

14、THAND: ;中断处理程序 IRET IRET汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计DOS 功能调用(功能调用(21H)存取存取中断向量:中断向量:设置中断向量:设置中断向量:AH = 25HAL = 中断类型号中断类型号DS : DX = 中断向量中断向量INT 21H取中断向量:取中断向量:AH = 35HAL = 中断类型号中断类型号INT 21H返回时送返回时送 ES : BX = 中断向量中断向量MOV AL, NMOV AL, NMOV AH, 35HMOV AH, 35HINT 21HINT 21H ; ; 取原中断向量取原中断向量PUS

15、H ESPUSH ESPUSH BXPUSH BX ; ; 保存原中断向量保存原中断向量PUSH DSPUSH DSMOV AX, SEG INTHANDMOV AX, SEG INTHANDMOV DS, AX MOV DS, AX MOV DX, OFFSET INTHANDMOV DX, OFFSET INTHANDMOV AL, NMOV AL, NMOV AH, 25HMOV AH, 25HINT 21HINT 21H ; ; 设置新的中断向量设置新的中断向量 POP DSPOP DSPOP DXPOP DXPOP DSPOP DSMOV AL, NMOV AL, NMOV AH,

16、25HMOV AH, 25HINT 21HINT 21H ; ; 恢复原中断向量恢复原中断向量INTHAND: INTHAND: ; ; 中断处理程序中断处理程序IRETIRET例:用例:用 DOS 功能调用存取中断向量功能调用存取中断向量汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计中断程序的编写步骤:中断程序的编写步骤:主程序:主程序:(1)设置中断向量设置中断向量(2)设置设置 CPU 的中断允许位的中断允许位 IF(3)设置设备的中断屏蔽位设置设备的中断屏蔽位中断处理子程序:中断处理子程序:(1)保存寄存器内容保存寄存器内容(2)如允许中断嵌套,则开中断

17、如允许中断嵌套,则开中断 ( STI )(3)中断处理功能中断处理功能(4)关中断关中断(5)送中断结束命令送中断结束命令( EOI )给中断命令寄存器给中断命令寄存器(6)恢复寄存器内容恢复寄存器内容(7)IRET中断返回中断返回 例例: : 编写一个中断处理程序,要求在主程序运行期间,编写一个中断处理程序,要求在主程序运行期间, 每隔每隔 1010秒响铃一次,同时显示秒响铃一次,同时显示 bell bell 定时器定时器 中断中断18.2次次/SEC; INT_TIMERINT 1CHIRETINT_1CH PROCIRETINT_ICH ENDPRING PROC1.计数计数182(10

18、秒秒)2.显示字符串显示字符串 IRETRING ENDP例:编写一个中断处理程序,要求在主程序运行期间,例:编写一个中断处理程序,要求在主程序运行期间, 每隔每隔 10 10 秒响铃一次,并显示秒响铃一次,并显示 bellbell.model small.stack.datacnt dw 1mes db bell,0ah,0dh,$.codemain proc farstart: mov ax, data mov ds, axmov al, 1chmov ah, 35hint 21hpush espush bxpush dsmov dx, offset ringringmov ax, seg

19、 ringringmov ds, axmov al, 1chmov ah, 25hint 21hpop dsin al, 21hand al, 11111110bout 21h, alsti mov di, 30000dly: mov si, 60000dly1: dec si jnz dly1 dec di jnz dly ;主程序 pop dx pop ds mov al, 1ch mov ah, 25h int 21h mov ax, 4c00h int 21hmain endpring proc nearring proc near ; ;保存寄存器保存寄存器 mov ax, data

20、 mov ds, ax sti ; ;开中断开中断 dec cnt jnz exit mov dx, offset mes mov ah, 09 int 21h call sound movmov cnt,182 cnt,182exit: cli ; ;关中断关中断 ; ;恢复寄存恢复寄存器器 iretring ring endpendp end start例:键盘模拟程序例:键盘模拟程序字符码字符码:采用ASCII码表示字母、数字、专用字符和一些 非打印字符,键盘上的控制键和功能键的ASCII码为0,必须用扫描码来识别。扫描码扫描码:键盘上的每个键都对应一个扫描码,扫描码是按 键的位置来排列

21、的。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,0data endsmain proc far lea bx, scatabkey_in: in al, 60h test al, 80h ;通码? jnz key_in push ax in al, 61h or al, 80h ;置应答位 out 61h, al and al, 7fh

22、out 61h, al;复位应答位 pop ax cmp al, 01 jz exit ;按Esc退出 xlatbxlatb cmp al, 0 jz no_disp call disp_charno_disp: jmp key_inexit: main endpdisp_char proc near mov ah, 2 mov dl, al int 21h retdisp_char endp 76543210设备控制寄存器61H键盘例:从键盘接收字符,同时对例:从键盘接收字符,同时对32字节的输入缓冲区进行字节的输入缓冲区进行 测试;如缓冲区已满,将键盘挂起,由打印机输出测试;如缓冲区已满,

23、将键盘挂起,由打印机输出 一个提示信息一个提示信息MAINBUFFER满CALLCALLIRETNKBD中断32次TYP中断17次KBINTIRETPRINTRETDISPRETINTIP汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计例:从键盘接收字符,同时对例:从键盘接收字符,同时对32字节的输入缓冲区进行字节的输入缓冲区进行 测试;如缓冲区已满,将键盘挂起,由打印机输出测试;如缓冲区已满,将键盘挂起,由打印机输出 一个提示信息一个提示信息 程序包括以下几个部分:程序包括以下几个部分:mainmain 初始化部分初始化部分kbintkbint 键盘中断处理程序

24、键盘中断处理程序intipintip 初始化打印机初始化打印机prtintprtint 打印机中断处理程序打印机中断处理程序dispdisp 用用十六进制显示十六进制显示alal中的内容中的内容 汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计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 ? sav

25、e_ipf dw ? save_csf dw ?dseg endsmain proc farmain proc far mov addr, offset buffer mov count, 0mov al, 09 ;键盘mov ah, 35hint 21hmov save_ip9, bxmov save_cs9, es mov dx, offset kbintpush dsmov ax, seg kbintmov ds, axmov al, 09mov ah, 25hint 21h pop ds in al, 21hand al, 0fdhout 21h, al mov al, 0fh ;打印

26、机mov ah, 35hint 21h mov save_ipf, bxmov save_csf, es mov dx, offset prtintpush dsmov ax, seg prtintmov ds, axmov al, 0fhmov ah, 25hint 21h pop ds mov ah, 9lea dx, promptint 21h sti mov di, 8000hdly: mov si, 9000hdly1: dec si jnz dly1 dec di jnz dly mov ah, 2 mov dl, $ int 21h cli push ds mov dx, sav

27、e_ip9 mov ax, save_cs9 mov ds, ax mov al, 09 mov ah, 25h int 21h pop dspush dsmov dx, save_ipfmov ax, save_csfmov ds, axmov al, 0fhmov ah, 25hint 21h pop dsin al, 21hand al, 0fdhout 21h, al stimain main endpendp kbintkbint proc near proc near push ax push bx in al, 60h push ax in al, 61h mov ah, al

28、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, bxcheck: cmp count,32 jb ret1 ;判断是否溢出 in al, 21h or al, 02 ;屏蔽键盘中断 and al, 7fh out 21h,al ;允许打印机中断 call intipret1:

29、 cli mov al, 20h out 20h,al ;结束键盘中断 pop bx pop ax iretkbintkbint endpendp intipintip proc near 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 ;送选通信号 jmp $+2 ;展宽选通信号 mov al, 1ch out dx, al pop dx

30、pop bx pop ax retintipintip endpendp prtintprtint proc near proc near push ax push bx push dx mov bx, addr mov al, bx mov dx, 378h out dx, al push ax mov dx, 37ah mov al, 1dh out dx, al jmp $+2 mov al, 1ch out dx, al pop ax inc bx mov addr, bx cmp al, 0ah jnz ret2 in al, 21h or al, 80h out 21h, al ;

31、屏蔽打印机中断ret2: mov al, 20h out 20h, al ;结束打印机中断 pop dx pop bx pop ax iretprtintprtint endpendp dispdisp proc near proc near ;显示扫描码 push ax push cx push dx mov ch, 2 mov cl, 4nextb: rol al, cl push ax mov dl, al and dl, 0fh or dl, 30h cmp dl, 3ah jl dispit add dl, 7dispit: mov ah, 2 int 21h pop ax dec ch jnz nextb mov ah, 2 mov dl, , int 21h pop dx pop cx pop ax retdispdisp endpendp汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计第八章作业第八章作业Page3138.2 8.5 8.6

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

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