《第八章输入输出程序设计》由会员分享,可在线阅读,更多相关《第八章输入输出程序设计(32页珍藏版)》请在金锄头文库上搜索。
1、汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计第八章第八章 输入输出程序设计输入输出程序设计CPUMEMI/O设备设备总线总线I/O接口接口际羹纠消密湿宫亩顽卜溢总浇邢粟香捧古保茄阎傀差颠严彪故勒抡师偶后第八章输入输出程序设计第八章输入输出程序设计汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计查询方式查询方式(程序控制方式程序控制方式)中断方式中断方式DMA方式方式(直接存储器存取方式直接存储器存取方式/ /成组传送方式成组传送方式)1. I/O 设备的数据传送方式设备的数据传送方式早毛隧炬嚷滦茄跪饥婉贵师彰蚂泌俺臃翼莹梢轰耀煞核
2、牢嫡汪谣彩犊局埂第八章输入输出程序设计第八章输入输出程序设计汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计 I/O 指指令令是是主主机机与与外外设设进进行行通通信信的的最最基基本本途途径径。DOS 功功能能调调用用和和BIOS例例行行程程序序中中的的输输入入/ /输输出出功功能也是由能也是由IN和和OUT指令完成的。指令完成的。例:循环测试某例:循环测试某状态寄存器状态寄存器的第的第2位是否为位是否为1 AGAIN: AGAIN: IN AL, IN AL, STATUS_PORTSTATUS_PORT TEST AL, 00000100B TEST AL, 0
3、0000100B JZ AGAIN JZ AGAIN2. 程序直接控制程序直接控制 I/O 方式方式 读读I/O状态状态准备好准备好? 传送数据传送数据NYIN AL,DATA_PORTIN AL,DATA_PORT 拾驮添城挑躁泅枪坡攘惑晒述履誓菱急袒敞捐此碎苔蚜臀棒确筷磐屿句涂第八章输入输出程序设计第八章输入输出程序设计 I/O 指指令令是是主主机机与与外外设设进进行行通通信信的的最最基基本本途途径径。DOS 功功能能调调用用和和BIOS例例行行程程序序中中的的输输入入/ /输输出出功功能也是由能也是由IN和和OUT指令完成的。指令完成的。例:循环测试某例:循环测试某状态寄存器状态寄存器的
4、第的第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状态状态准备好?准备好? 传送数据传送数据NYMOV AL, DATAMOV AL, DATAOUT DATA_PORT, ALOUT DATA_PORT, AL样屏蝇枫对兰峻刃懂食啤漏绵障居仔夹东弘香祭舍鲍匪织优搔碱峦业封桔第八章输入输出程序设计第八章输入输出程序设计轮流查询几种轮流查询几种I/
5、O设备:设备:DEV1: INAL, STAT1TESTAL, STAT1_BITJZDEV2CALLFAR PTR PROC1DEV2: INAL, STAT2TESTAL, STAT2_BITJZDEV3CALLFAR PTR PROC2DEV3: INAL, STAT3TESTAL, STAT3_BITJZDEV1CALLFAR PTR PROC3优:程序安排或修改设备的优先次序缺:查询等待浪费CPU大量有效时间乞醉严耗钧佣娟才猛糯少愿防砷照嫩注窗蠢忍砸斑定箩劳豌董做宙市盐领第八章输入输出程序设计第八章输入输出程序设计汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出
6、程序设计设备控制寄存器设备控制寄存器( 61h61h )1/0 01/0 0 控制其它外部设备控制其它外部设备与与门门放大器放大器2号定时器门控号定时器门控1 0例:例:Sound 程序程序1 mov dx, 100mov dx, 100 in al, 61hin al, 61h and al, 11111100b and al, 11111100bsound: xor al, 2sound: xor al, 2 out 61h, alout 61h, al mov cx, 140h mov cx, 140hwait1: loop wait1wait1: loop wait1 dec dx d
7、ec dx jne sound jne 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
8、ax in al, 61h and al, 0fch out 61h, al pop ax retspeaker_off endpend例:例:Sound 程序程序2瘤墒俄挺希喷枚鸟光辙姻韧女莲秩召轨官亥治祟贡疹倦尝露尔灰化浴扣疵第八章输入输出程序设计第八章输入输出程序设计print proc nearprint proc near push ax push ax push dx push dx mov dx, mov dx, 378h378h ; ; 数据寄存器数据寄存器 out dx, al out dx, al mov dx, mov dx, 379h 379h ; ; 状态寄存器状态寄
9、存器again: in al, dxagain: in al, dx test al, 80h ; test al, 80h ; (dx)7 7 = busy je again je again ; =0,; =0,打印机忙打印机忙 mov dx, mov dx, 37ah 37ah ; ; 控制寄存器控制寄存器 mov al, 0dhmov al, 0dh out dx, al out dx, al ; 送选通信号送选通信号 jmp $+2jmp $+2 ; ; 展宽选通信号展宽选通信号 mov al, 0ch mov al, 0ch out dx, al out dx, al pop dx
10、 pop dx pop ax pop ax ret retprint endpprint endp例:打印机查询输出子程序例:打印机查询输出子程序00001101选通位自动换行初始化选择位中断位37AH祸熔厘尖悦妥漂核遇佣仁英武卸崇疹斋咨填瘩蓑诌孽矛蝗樱吠邱百意元犬第八章输入输出程序设计第八章输入输出程序设计汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计中断源:中断源:引起中断的事件引起中断的事件外中断外中断(硬中断硬中断): 外设的外设的 I/O 请求请求 可屏蔽中断可屏蔽中断 电源掉电电源掉电 / 奇偶错奇偶错 非屏蔽中断非屏蔽中断内中断内中断(软中断软中断
11、): INT 指令指令 / CPU 错(除法错、溢出)错(除法错、溢出)/ 为调试程序设置的中断为调试程序设置的中断3. 中断传送方式中断传送方式骂殿浓陛盏异柿备涧索邪蒋可蒋削溢蝗怀狸殿憨捡吮戈灸韵衣始命联万遥第八章输入输出程序设计第八章输入输出程序设计汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计非屏蔽中断请求非屏蔽中断请求中断逻辑中断逻辑INT nINTO除法错除法错单步单步 n 4 0 1CPU 2 NMI8259A可可编编程程中中断断控控制制器器(PIC)IR0 系统定时器系统定时器IR1 键盘键盘IR2 彩色彩色/图形接口图形接口IR3 保留保留IR4
12、 串行通讯口串行通讯口IR5 保留保留IR6 软盘软盘IR7 打印机打印机INTR08090A0B0C0D0E0F80x86 中断源:中断源:濒悲悉潮非馁基踏隙浪踌母锦趣帧畸浓们惑厅骏堕跳丘峪巴呆胺倦氧隶覆第八章输入输出程序设计第八章输入输出程序设计设置设置CPU中断允许位:中断允许位:FLAGS 中的中的 IF 位位 = 1 允许中断允许中断 ( STI ) = 0 禁止中断禁止中断 ( CLI )设置中断屏蔽位:设置中断屏蔽位: 中断屏蔽寄存器的中断屏蔽位中断屏蔽寄存器的中断屏蔽位 = 0 允许允许I/O设备请求中断设备请求中断 = 1 禁止禁止I/O设备请求中断设备请求中断 7 6 5
13、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的
14、的(CS)0000000004 4*N003FC中断向量中断向量中断处理程序的入口中断处理程序的入口 地址(段址)地址(段址):(偏址)(偏址)中断向量表中断向量表用户可利用保留的中断类型号用户可利用保留的中断类型号扩充自己需要的中断功能。扩充自己需要的中断功能。礁攘墒锥看且爸楞场竣锰垄绢褪越躲民闻渗旋捏兑焕毙疤孤范朋县猪擞建第八章输入输出程序设计第八章输入输出程序设计汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计CPU中断过程:中断过程:(1)取中断类型:)取中断类型:CPU type N(2)保护现场:)保护现场:FLAGS、CS、IP入栈入栈(3)IF=0
15、, TF=0(4)取中断向量)取中断向量:(:(4N) IP (4N2) CS(5)转中断处理程序)转中断处理程序梁孤属涵咬极品超欲就许埋隘改爽热车铬雪坝纲药洋夸视若蝶踪心叫唆骆第八章输入输出程序设计第八章输入输出程序设计例例:为中断类型为中断类型 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 ;偏移
16、地址(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: INTHAND: ;中断处理程序 IRET IRET粳母瘪颜镇抒彝麓刚先懊峪巍淌饯撑购恼庶脱怕讫所粒玫影呈饼棺陇镀隔第八章输入输出程序设计第八章输入输出程序设计汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计DOS 功能调用(功能调用(21H)存取存取中断向量:中断向量:设置中断向量:设置中断向量:AH = 25HAL = 中断类型号中
17、断类型号DS : DX = 中断向量中断向量INT 21H取中断向量:取中断向量:AH = 35HAL = 中断类型号中断类型号INT 21H返回时送返回时送 ES : BX = 中断向量中断向量魏仑嘱欧谢虞霄癸青宅跌检寡建勉经滇溉吗藏瘦诫颇房杰挛漏宛诌剿仆瞳第八章输入输出程序设计第八章输入输出程序设计MOV AL, NMOV AL, NMOV AH, 35HMOV AH, 35HINT 21HINT 21H ; ; 取原中断向量取原中断向量PUSH ESPUSH ESPUSH BXPUSH BX ; ; 保存原中断向量保存原中断向量PUSH DSPUSH DSMOV AX, SEG INTH
18、ANDMOV 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, 25HMOV AH, 25HINT 21HINT 21H ; ; 恢复原中断向量恢复原中断向量INTHAND: INTHAND: ; ; 中断处理程
19、序中断处理程序IRETIRET例:用例:用 DOS 功能调用存取中断向量功能调用存取中断向量嫡泊戮析乃玻社牌艰盯组艳掣蔽岔爬妖莎颐恐帆者悬熔荷青映妇糖荡汗毅第八章输入输出程序设计第八章输入输出程序设计汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计中断程序的编写步骤:中断程序的编写步骤:主程序:主程序:(1)设置中断向量设置中断向量(2)设置设置 CPU 的中断允许位的中断允许位 IF(3)设置设备的中断屏蔽位设置设备的中断屏蔽位中断处理子程序:中断处理子程序:(1)保存寄存器内容保存寄存器内容(2)如允许中断嵌套,则开中断如允许中断嵌套,则开中断 ( STI )
20、(3)中断处理功能中断处理功能(4)关中断关中断(5)送中断结束命令送中断结束命令( EOI )给中断命令寄存器给中断命令寄存器(6)恢复寄存器内容恢复寄存器内容(7)IRET中断返回中断返回藻忿磁霹矩羊冶血扇观跪萝侠撂贡击悍惟销尿虞技纠掠洽岂狈氓徽议乍顺第八章输入输出程序设计第八章输入输出程序设计 例例: : 编写一个中断处理程序,要求在主程序运行期间,编写一个中断处理程序,要求在主程序运行期间, 每隔每隔 10 10秒响铃一次,同时显示秒响铃一次,同时显示 bell bell 定时器定时器 中断中断18.2次次/SEC; INT_TIMERINT 1CHIRETINT_1CH PROCIR
21、ETINT_ICH ENDPRING PROC1.计数计数182(10秒秒)2.显示字符串显示字符串 IRETRING ENDP卖奥氨魂枕捍帜碑挝汰缅滑关惩窝芽但生窑讼猴志剃松讲统房瑰酋凳踌比第八章输入输出程序设计第八章输入输出程序设计例:编写一个中断处理程序,要求在主程序运行期间,例:编写一个中断处理程序,要求在主程序运行期间, 每隔每隔 10 10 秒响铃一次,并显示秒响铃一次,并显示 bell bell.model small.stack.datacnt dw 1mes db bell,0ah,0dh,$.codemain proc farstart: mov ax, data mov
22、ds, axmov al, 1chmov ah, 35hint 21hpush espush bxpush dsmov dx, offset ringringmov ax, seg 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
23、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 mov ds, ax sti ; ;开中断开中断 dec cnt jnz exit mov dx, offset mes mov ah, 09 int 21h call sound mov cnt,182mov cnt,182exit: cli ; ;关中断关中断 ; ;恢复寄存器恢复寄存器 iretring
24、 endpring endp end start灰牢堪匡酌地洛俞抨愤瓷装嗣睡暑翟谱庐踞块弥地炙尼裔闯出格欧息露侗第八章输入输出程序设计第八章输入输出程序设计例:键盘模拟程序例:键盘模拟程序字符码字符码:采用ASCII码表示字母、数字、专用字符和一些 非打印字符,键盘上的控制键和功能键的ASCII码为0,必须用扫描码来识别。扫描码扫描码:键盘上的每个键都对应一个扫描码,扫描码是按 键的位置来排列的。data segment scatab db 0,0,1234567890-=,8,0 db qwertyuiop,0dh,0 db asdfghjkl;,0,0,0,0 db zxcvbnm,./,
25、0,0,0 db ,0,0,0,0,0,0,0,0,0,0,0,0,0 db 789-456+1230,0data ends贺棒荤今狼队磺付选稽跳罗矩全用还葵矫淋垃竟厢瓦片罢短殖驴得尼档证第八章输入输出程序设计第八章输入输出程序设计main 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 out 61h, al;复位应答位 pop ax cmp al, 01 jz exit ;按Es
26、c退出 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字节的输入缓冲区进行字节的输入缓冲区进行 测试;如缓冲区已满,将键盘挂起,由打印机输出测试;如
27、缓冲区已满,将键盘挂起,由打印机输出 一个提示信息一个提示信息MAINBUFFER满CALLCALLIRETNKBD中断32次TYP中断17次KBINTIRETPRINTRETDISPRETINTIP腥迅赊艇逐疏共炯皱麓厅温英痔羽浦厄单豌钻痔嘛萧弛舆育役叙晌沮撕帆第八章输入输出程序设计第八章输入输出程序设计汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计例:从键盘接收字符,同时对例:从键盘接收字符,同时对32字节的输入缓冲区进行字节的输入缓冲区进行 测试;如缓冲区已满,将键盘挂起,由打印机输出测试;如缓冲区已满,将键盘挂起,由打印机输出 一个提示信息一个提示信息
28、程序包括以下几个部分:程序包括以下几个部分:mainmain 初始化部分初始化部分kbintkbint 键盘中断处理程序键盘中断处理程序intipintip 初始化打印机初始化打印机prtintprtint 打印机中断处理程序打印机中断处理程序dispdisp 用十六进制显示用十六进制显示alal中的内容中的内容 华悄本聘娃汗镍掐樟频种淘奔扛侥脆郝裴汇曝窜勾菊姐阅肆厅靛郡界越月第八章输入输出程序设计第八章输入输出程序设计汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计dseg segment addr dw ? ;缓冲区指针 count dw ? buffer d
29、b 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 endsmain proc farmain proc far mov addr, offset buffer mov count, 0吠得藩鹅柳嵌中忍洋燃簿编约肛俊泞引全宇独神贡臂极脚告挫疡镣迈宰廊第八章输入输出程序设计第八章输入输出程序设计mov al, 09 ;键盘mov ah, 35hint 21hmov
30、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 ;打印机mov ah, 35hint 21h mov save_ipf, bxmov save_csf, es mov dx, offset prtintpush dsmov ax, seg prtintmov ds, axmov al, 0fhmov ah, 25hi
31、nt 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, save_ip9 mov ax, save_cs9 mov ds, ax mov al, 09 mov ah, 25h int 21h pop dspush ds
32、mov dx, save_ipfmov ax, save_csfmov ds, axmov al, 0fhmov ah, 25hint 21h pop dsin al, 21hand al, 0fdhout 21h, al stimain endpmain endp 炎魏伯避宜分肖右抓频桔威范宣莫州钦白倚沏醇镇害诬考惦惹吹验愁涧撮第八章输入输出程序设计第八章输入输出程序设计kbint proc nearkbint proc near push ax push bx in al, 60h push ax in al, 61h mov ah, al or al, 80h out 61h, al ;
33、送键盘应答信号 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: cli mov al, 20h out 20h
34、,al ;结束键盘中断 pop bx pop ax iretkbint endpkbint endp 糜锥本饰灭偿梭铜掳贫职北陵桐厘喀侗垮骋迁容婚姬披柄景敏暇撵懈浦查第八章输入输出程序设计第八章输入输出程序设计intip proc nearintip 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 ;展宽选通信号
35、 mov al, 1ch out dx, al pop dx pop bx pop ax retintip endpintip endp 陇友谩缠葡壤腋夷宏蔡敬苹卡负土磨埔蓟发茫允取惶粮秩祖馁拦觅灯详付第八章输入输出程序设计第八章输入输出程序设计prtint proc nearprtint 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,
36、al pop ax inc bx mov addr, bx cmp al, 0ah jnz ret2 in al, 21h or al, 80h out 21h, al ;屏蔽打印机中断ret2: mov al, 20h out 20h, al ;结束打印机中断 pop dx pop bx pop ax iretprtint endpprtint endp 滓瘟种犯激器日昨甥冀句劈搐凶莹宫鼓板泰寂圭梦毕树鹊晤迈夜瓣滚乌径第八章输入输出程序设计第八章输入输出程序设计disp proc neardisp proc near ;显示扫描码 push ax push cx push dx mov ch
37、, 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 retdisp endpdisp endp鲜识殴冈束操功遮眶综记柿蔫眺遗熔扛素讶苛暗队押胞役朋射耘侠烷偶撕第八章输入输出程序设计第八章输入输出程序设计汇编语言程序设计汇编语言程序设计第八章第八章 输入输出程序设计输入输出程序设计第八章作业第八章作业Page3138.2 8.5 8.6 爵柬狙开疡眠稿患彝铭兔抡零奴乓泣哄精预毛协渔疏剁镇拉蜘炳黎巨赘凭第八章输入输出程序设计第八章输入输出程序设计