资源描述:
《第8章_输入输出程序设计(书)(05).ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第8章输入/输出程序设计第8章输入/输出程序设计8.1I/O设备的数据传送方式8.2程序直接控制I/O方式8.3中断传送方式开始计算机系统通过硬件接口及I/O控制程序对外部设备进行控制,使其能协调地有效地完成输入输出工作。汇编语言是编写I/O程序对硬件直接控制的最有效的程序设计语言。8.1I/O设备的数据传送方式每种输入输出设备都要通过一个硬件接口或控制器和CPU相连。8.1I/O设备数据的传送方式‘软盘内存、计算器、控制器(CPU)显示器软盘控制器数据接口(数据为ASCII码)接口和控制器都能支持输入
2、/输出指令IN,OUT。CPU与外部设备交换信息:1)控制信息:告诉接口和设备要做什么。2)状态信息:从接口输入的状态信息表示I/O设备当前的状态。3)数据信息:I/O和CPU真正要交换的信息。.I/O方式:(1)程序直接控制输入/输出方式(2)中断传送方式(3)DMA方式:由硬件控制器实现传送功能2 .DMA方式:(DirectMemoryAccess)直接存储器存取方式,它适用于高速I/O设备。如:磁盘的数据传输。DMA方式:I/O设备和存储器进行成批数据传送。DMA控制器包括四个寄存器:1)状态
3、控制寄存器2)数据寄存器3)地址寄存器+14)字节计数器-1存储器外部设备CPUDMA请求DMA响应HOLDHLDADMA控制器图DMA控制器与CPU关系图DMA方式数据传送的步骤:1、DMA控制器向CPU发出HOLD信号,请示使用总线。2、CPU发出响应信号HOLDA给DMA控制器,并将总线让出,这时CPU不再使用总线,而DMA控制器获得总线控制权。3、传输数据的存储器地址通过地址总线发出。4、传输数据的字节通过数据总线进行传送。5、地址寄存器增16、字节计数器减17、如字节计数器非0,转向第3步1、
4、I/O端口计算机的外部设备和大容量存储设备都是通过接口连到系统上,每个接口由一组寄存器组成,这些寄存器都分配I/O端口的地址编码。计算机的CPU和内存就是通过这些端口和外设进行通信。控制寄存器:保存CPU命令以控制接口和设备状态寄存器:保存设备和接口状态信息供CPU对外设测试数据寄存器:数据缓冲。8.2程序直接控制I/O方式在PC中,I/O端口编址在一个独立的地址空间中,这个I/O空间允许设备64K个(65536个)8位端口。一般在系统中只有十几个外设和大容量存储设备和PC相连见P2840—0FHDMA
5、芯片8237A20—21H中断控制器8259A接口芯片实际占用的端口数目端口号(16进制)8237DMA控制器1600~0F8259A中断控制器220~218255并行接口460~63DMA页面寄存器(74LS670)480~83NMI寄存器1A08253计数器/定时器440~432、I/O指令:IN/OUT有直接端口寻址和间接端口寻址两方式传送字、字节。直接寻址:地址PORT是8位立即数,范围0-255间接寻址:地址PORT在DX中,范围0-65536例1:如把一个字从端口地址0028H,0029传送
6、到DATA_WORD单元中INAX,28HMOVDATA_WORD,AXIN指令中使用AX寄存器,所以从28H、29H读取一个字送入AX。3、I/O程序举例例1.sound程序--直接控制扬声器发出声音的程序。程序通过I/O指令使设备控制寄存器(地址为61H)的第1位交替为0和1,而端口61H的第1位和扬声器的脉冲站相连.当第1位由0变为1,延迟一会又由0变为1时,脉冲门就先打开后关闭,产生了一个脉冲电流—放大—送扬声器—发声.1/00710[设备控制器]端口61H2号定时器门控与门放大器控制其他外设S
7、tart:movdx,100;开关次数为100inal,61h;取得设备控制寄存器开关量Sound:xoral,2;将第1位置1,00000010/11111111out61h,al;输出到端口61h,[61h](al)movdx,140h;等待延迟140的时间(开/关)Wait1:loopwait1decdx;开/关次数jnesoundmovah,4chint21h1/00710[设备控制器]端口61H2号定时器门控与门放大器PrognamsegmentMainprocfarassumecs:pron
8、am控制其他外设Start:movdx,100;开关次数为100inal,61h;读取设备控制寄存器开关量andal,1111100;对第0,1位置07654321/00000010Sound:xoral,2;将第1位置1,00000010/11111111out61h,al;输出到端口61h,[61h]←(al)movcx,140h;等待延迟140的时间(开/关)Wait1:loopwait1decdx;开/关次数jnesoundmova