汇编语言第8章_第1页
汇编语言第8章_第2页
汇编语言第8章_第3页
汇编语言第8章_第4页
汇编语言第8章_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、GAIN: 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 4 I/O 指令指令是主机与外设进行通信的最基本途径是主机与外设进行通信的最基本途径。DOS 功能调用和功能调用和BIOS例行程序中的输入例行程序中的输入/ /输出输出功能也是由功能也是由IN和和OUT指令完成的。指令完成

3、的。例:循环测试某例:循环测试某状态寄存器状态寄存器的第的第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, AL5轮流查询几种轮流查询几种I/O设备:设备:DEV1: INAL, STAT1TE

4、STAL, 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, 1

5、00 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 dec dx jne sound jne sound 7.model tiny.code.startupcall speaker_onmov ah, 1int 21hcall speaker_off.exit 0speaker_on p

6、roc 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 61h, al pop ax retspeaker_off endpend例:例:Sound 程序程序28print proc nearprint proc near push ax push ax push dx push dx mov dx, mov dx, 378h378h ; ; 数据寄存器数据寄存器 out dx, al out dx, al

7、mov dx, mov dx, 379h 379h ; ; 状态寄存器状态寄存器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, 0chmov

8、 al, 0ch out dx, al out dx, al pop dx pop dx pop ax pop ax ret retprint endpprint endp例:打印机查询输出子程序例:打印机查询输出子程序0 0 0 0 1 1 0 1选通位自动换行初始化选择位中断位37AH9中断源:中断源:引起中断的事件引起中断的事件外中断外中断(硬中断硬中断): 外设的外设的 I/O 请求请求 可屏蔽中断可屏蔽中断 电源掉电电源掉电 / 奇偶错奇偶错 非屏蔽中断非屏蔽中断内中断内中断(软中断软中断): INT 指令指令 / CPU 错(除法错、溢出)错(除法错、溢出)/ 为调试程序设置的中断

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

10、中断禁止中断 ( 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 EOIMOV AL, 20HOUT 20H, AL8259A中断的条件:中断的条件:IN AL, 21HAND AL,0FDH OUT 21H,AL12 类型类型0的的(IP) 类型类型0的的(CS) 类型类型1的的(I

11、P) 类型类型1的的(CS) 类型类型N的的(IP) 类型类型N的的(CS) 类型类型255的的(IP) 类型类型255的的(CS)0000000004 4*N003FC中断向量中断向量中断处理程序的入口中断处理程序的入口 地址(段址)地址(段址):(偏址)(偏址)中断向量中断向量表表用户可利用保留的中断类型号用户可利用保留的中断类型号扩充自己需要的中断功能。扩充自己需要的中断功能。13CPU中断过程:中断过程:(1)取中断类型:)取中断类型:CPU type N(2)保护现场:)保护现场:FLAGS、CS、IP入栈入栈(3)IF=0, TF=0(4)取中断向量)取中断向量:(:(4N) IP

12、 (4N2) CS(5)转中断处理程序)转中断处理程序14例例:为中断类型为中断类型 N 设置中断向量设置中断向量 MOV AX, 0 MOV AX, 0 MOV ES, AX MOV ES, AX MOV BX, N MOV BX, N* *4 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: W

13、ORD PTRBX+2,AX ;段地址(N*4+2) INTHAND: INTHAND: ;中断处理程序 IRET IRET15DOS 功能调用(功能调用(21H)存取存取中断向量:中断向量:设置中断向量:设置中断向量:AH = 25HAL = 中断类型号中断类型号DS : DX = 中断向量中断向量INT 21H取中断向量:取中断向量:AH = 35HAL = 中断类型号中断类型号INT 21H返回时送返回时送 ES : BX = 中断向量中断向量16MOV AL, NMOV AL, NMOV AH, 35HMOV AH, 35HINT 21HINT 21H ; ; 取原中断向量取原中断向量

14、PUSH 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 A

15、H, 25HMOV AH, 25HINT 21HINT 21H ; ; 恢复原中断向量恢复原中断向量INTHAND: INTHAND: ; ; 中断处理程序中断处理程序IRETIRET例:用例:用 DOS 功能调用存取中断向量功能调用存取中断向量17中断程序的编写步骤:中断程序的编写步骤:主程序:主程序:设置中断向量设置中断向量设置设置 CPU 的中断允许位的中断允许位 IF设置设备的中断屏蔽位设置设备的中断屏蔽位中断处理子程序:中断处理子程序:保存寄存器内容保存寄存器内容如允许中断嵌套,则开中断如允许中断嵌套,则开中断 ( STI )中断中断处理功能处理功能关中断关中断送中断结束命令送中断结

16、束命令( EOI )给中断命令寄存器给中断命令寄存器恢复寄存器内容恢复寄存器内容(1) IRET中断返回中断返回18 例例: : 编写一个中断处理程序,要求在主程序运行期间,编写一个中断处理程序,要求在主程序运行期间, 每隔每隔 1010秒响铃一次,同时显示秒响铃一次,同时显示 bell bell 定时器定时器 中断中断18.2次次/SEC ; INT_TIMERINT 1CH IRET INT_1CH PROC IRET INT_ICH ENDPRING PROC1.计数计数182(10秒秒)2.显示字符串显示字符串 IRETRING ENDP19例:编写一个中断处理程序,要求在主程序运行期

17、间,例:编写一个中断处理程序,要求在主程序运行期间, 每隔每隔 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 ringringmov ds, axmov al, 1chmov ah, 25hint 21hpop

18、 dsin al, 21hand al, 11111110bout 21h, alsti20 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 mov ds, ax sti ; ;开中断开中断 dec cnt jnz exit mov dx

19、, offset mes mov ah, 09 int 21h call sound mov cnt,182mov cnt,182exit: cli ; ;关中断关中断 ; ;恢复寄存器恢复寄存器 iretring endpring endp end start21例:键盘模拟程序例:键盘模拟程序字符码字符码:采用ASCII 码表示字母、数字、专用字符和一些 非打印字符,键盘上的控制键和功能键的ASCII 码为0,必须用扫描码来识别。扫描码扫描码:键盘上的每个键都对应一个扫描码,扫描码是按 键的位置来排列的。data segment scatab db 0,0,1234567890-=,8,0

20、 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 ends22main 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

21、 ;按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 7 6 5 4 3 2 1 0设备控制寄存器 61H键盘23例:从键盘接收字符,同时对例:从键盘接收字符,同时对32字节的输入缓冲区进行字节的输入缓冲区进行 测试;如缓冲区已满,将键盘挂起,由打印机输出测试;如缓冲区已满,将键盘挂起,由打印机输出 一个提示信息一个提示信息MAINBUFF

22、ER满 CALL CALL IRETNKBD中断32次TYP中断17次KBINTIRETPRINTRETDISPRETINTIP24例:从键盘接收字符,同时对例:从键盘接收字符,同时对32字节的输入缓冲区进行字节的输入缓冲区进行 测试;如缓冲区已满,将键盘挂起,由打印机输出测试;如缓冲区已满,将键盘挂起,由打印机输出 一个提示信息一个提示信息 程序包括以下几个部分:程序包括以下几个部分:main main 初始化部分初始化部分kbint kbint 键盘中断处理程序键盘中断处理程序intip intip 初始化打印机初始化打印机prtint prtint 打印机中断处理程序打印机中断处理程序d

23、isp disp 用十六进制显示用十六进制显示alal中的内容中的内容 25dseg 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 endsmain proc farmain proc far mov addr, offset buffer mov count, 026m

24、ov 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 ;打印机mov ah, 35hint 21h mov save_ipf, bxmov save_csf, es mov dx, offset prtintpush dsmov ax, seg prti

25、ntmov ds, axmov al, 0fhmov ah, 25hint 21h pop ds mov ah, 9lea dx, promptint 21h27 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 dsmov dx, save_ipfm

26、ov ax, save_csfmov ds, axmov al, 0fhmov ah, 25hint 21h pop dsin al, 21hand al, 0fdhout 21h, al stimain endpmain endp 28 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 ;送键盘应答信号 xchg ah, al out 61h, al ;复位键盘 pop ax test al, 80h jnz ret1 ;

27、通码时处理通码:通码:(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,al ;结束键盘中断 pop bx pop ax iretkbint endpkbint endp 29intip proc nearintip proc near push ax push bx push dx cli

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论