第十章 输入输出程序设计 10.1 输入输出指令 输入输出(I/O)是指CPU与输入设备和输出设备之间进行的信息传送。CPU与外部设备之间通过输入输出接口相连接。各个设备在输入输出接口中分配了相应的端口。访问不同的设备就是访问其对应的端口。在指令系统中提供了访问输入输出端口的指令。 一、I/O端口寻址方式 在计算机系统,对I/O端口的寻址方式有以下两种方法。 1、存储器编址方法 这种方法是指将I/O端口视为存储器的一个单元,对端口的访问就如同访问存储单元一样。访问存储器的指令和各种寻址方式同样适用对I/O端口的访问。 这种方式的特点是程序设计灵活,但需要占用存储地址空间。 2、I/O端口编址方法 端口的地址范围为64K个8位端口或32K个16位端口。地址不分段。存储器地址和I/O端口地址都是通过地址总线传送。为了区分一个地址是存储器地址或端口地址,8086/8088CUP通过一条控制线M/IO或M/IO来控制。 在这种方法中,I/O端口的地址与存储器地址分开,并使用专门的输入指令和输出指令。8086/8088系统中就是采用的这种方式。 * 当M/IO =1时,总线上地址为访问存储器 * 当M/IO =0时,总线上地址为访问I/O端口
OPRN1为输出端口地址,可以采用与输入指令类似的直接端口寻址和间接端口寻址。OPRN2是AL(字节输出)或AX(字输出)。 二、输入输出指令 1、输入指令 格式: IN OPRN1,OPRN2 OPRN1为AL(字节输入)或AX(字输入)。OPRN2为输入端口地址,它可以是一个8位地址值,可以访问的端口地址范围0—255,这种方式称为直接端口寻址。也可以是用寄存器DX指定的一个16位地址,可以访问的端口地址范围为0—65535。这种方式称为间接端口寻址。 例如: IN AL, 10H ;从一个8位端口输入一个字节到AL中 IN AX, 30H ;从一个16位端口输入一个字到AX中 IN AL, DX ; IN AX, DX ; 2、输出指令 格式:OUT OPRN1,OPRN2 例如: OPRN1为输出端口地址,可以采用与输入指令类似的直接端口寻址和间接端口寻址。OPRN2是AL(字节输出)或AX(字输出)。 OUT 10H, AL ;将AL中的数据输出到地址为10H的8位端口中 OUT 30H, AX ;将AX中的数据输出到地址为30H的16位端口中 OUT DX, AL ;将AL中的数据输出到由DX指定的8位端口中 OUT DX, AX ;将AX中的数据输出到由DX指定的16位端口中
中断是现代计算机系统中必须具备的一个基本的工作控制方式。 10.3 中断概念 一、一般概念 中断是现代计算机系统中必须具备的一个基本的工作控制方式。 所谓中断是指,当计算机正在执行某个程序时,突然发生了某个随机事态,如掉电,计时器计时到,某输入输出设备要求与CUP进行一次数据交换等等。这时,CUP需要中断原有程序的运行,而转去处理这些紧急事态。当处理完后,CUP又返回到原来的程序继续执行。中断处理过程如图所示。 中断控制技术主要应用在下列几种场合: 1、及时处理计算机中的突发故障。如执行指令时产生溢出,内存出错等。 2、协调主机与外设工作速度的矛盾。 3、在实时控制系统中,及时处理各控制点的现场信息。 例行程序 中断服务程序 第n条指令 第n+1条指令 例行程序
二、中断源及中断类型码 引起中断的原因或来源称为中断源。8086/8088CUP可以处理256种类型的中断,这些中断源可分为两大类。 1、外部中断 非CUP内部原因产生的中断,称为外部中断。外部中断又分为非屏蔽中断和可屏蔽中断。 可屏蔽中断 8086/8088为每个中断源都要分配一个中断类型码。中断类型码的分配由操作系统指定, ——可以通过标志寄存器中的中断允许位IF控制CUP是否响应中断请求。当IF=1,允许CUP响应可屏蔽中断;IF=0,禁止CUP响应可屏蔽中断。IF由指令STI和CLI设置。 ——不能由IF控制的中断源。当非屏蔽中断发生后,CUP一定要响应。 非屏蔽中断 2、内部中断 由CUP内部发生的事件称为内部中断。如除法运算出错,执行软中断指令、单步执行中断等。
在内存的最小地址的1K字节空间是中断矢量表。 三、中断矢量表 对中断的处理是通过执行中断服务程序来实现的。为了执行中断服务程序,需要获得中断服务程序的入口地址。在不同的计算机系统中,其获取的方法可能不同,8086/8088采用的是矢量中断结构。 000H 类型0 在内存的最小地址的1K字节空间是中断矢量表。 004H 类型1 每个中断类型的中断服务程序的入口地址占4个字节单元,其中低字单元内容为偏移量,送IP寄存器;高字单元内容为段基值,送CS寄存器。 008H 类型2 中断类型N的中断服务程序入口地址在内存中的首字节地址为4*N。 3F8H 类型254 3FCH 类型255
四、中断过程 一个完整的中断过程包括以下四个步骤: 1、中断请求 一个中断源当满足一定条件后,将向CPU提出中断请求。 2、中断响应 CPU每执行完一条指令后,都要查询是否有中断请求送来,按照一定次序查询各种中断源。如果有中断请求,根据一定的规定和条件决定是否响应该中断。如果CPU响应中断,则将做以下几项工作: 3、中断处理 * 将标志寄存器内容压栈; 4、中断返回 * 保存断点(CS和IP内容压栈); * 禁止新的中断 (IF<=0, TF<=0); * 根据中断类型码从中断矢量表取出中断服务程序的入口地址,送入IP和CS。 3、中断处理 执行中断服务程序就是完成中断处理。根据中断源的不同,所要求的处理也不同。因此其中断处理程序也不相同。
4、中断返回 一个中断服务程序最后执行的指令一定是中断返回指令IRET,执行该指令将完成以下操作: * 从堆栈中弹出一个字送IP; * 从堆栈中弹出一个字送CS; * 从堆栈中弹出一个字送标志寄存器。