输入输出编程

实验目的

  1. 理解查询输入方式的原理;

  2. 理解向量中断的原理,掌握中断请求、中断响应、中断处理的过程;

  3. 掌握中断屏蔽在中断过程中的作用;理解中断嵌套的实现方法。

实验原理

模型计算机输入输出系统的硬件设计见JUC-3模型计算机设计指导,包括拨动开关输入接口和LED输出接口。拨动开关输入接口一共有4个,它们共用16个拨动开关S15~0作为数据输入,由4个按键PB3~0分别作为4个接口的时钟输入,按下某个按键时将开关数据保存到该接口的数据寄存器中。接口包含数据寄存器和状态寄存器,支持查询输入和中断输入。

1. 查询方式输入

图 1是查询输入程序流程图,依次查询4个输入端口的状态位,如果某输入端口对应的状态位为1,表示该端口已经有输入数据在数据寄存器中,从接口的数据寄存器读出数据输出到红色LED显示;并且用绿色LED指示哪个接口收到了数据,L18~L21分别对应PB0~PB3触发的输入。

查询输入流程图
图 1. 查询输入流程图

汇编语言程序见清单 1。FF04H~FF07H是4个输入接口的数据寄存器地址,FF03H是输入接口的状态寄存器的地址,FF01H和FF02H是2个LED输出接口寄存器的地址,有关输入输出接口的详细信息见JUC-3模型计算机设计指导的输入输出部分

清单 1. 查询输入汇编语言程序
    ORG 0030H
L1: MOV #0001H,R0
    MOV #FF04H,R1
L2: MOV FF03H,R2
    TEST R0,FF03H
    JZ `L3
    MOV (R1),FF02H
    MOV R0,FF01H
L3: SHL R0
    INC R1
    CMP #0010H,R0
    JNZ L2
    JMP L1

2. 中断方式输入

中断系统采用向量中断方式,中断向量表的首地址是0000H,每个中断向量占用一个存储单元,存放该中断服务程序的入口地址。在主程序中,首先初始化中断向量表,也就是将中断服务程序的入口地址填入中断向量表,见图 2;开中断之后,将红色LED接口数据取反;之后一直重复延时、LED取反这个过程,因此红色LED会交替亮灭。

主程序流程图
图 2. 主程序流程图

在主程序运行过程中,如果按下PB0~PB3按键将产生中断请求。在各自的中断服务程序中,将开关输入接口的数据输出到红色LED显示,并且将接口序号通过绿色LED指示出来,反映当前中断是哪一个接口产生的。中断服务程序流程见图 3

中断服务程序流程图
图 3. 中断服务程序流程图

3. 中断嵌套

允许中断嵌套的中断服务程序流程图见图 4。在将屏蔽字保存到堆栈、设置新屏蔽字之后,开中断,允许在该中断服务程序中嵌套中断;中断返回之前,还要从堆栈中恢复原来的屏蔽字。中断屏蔽字的地址是FF00H。

允许嵌套的中断服务程序流程图
图 4. 允许嵌套的中断服务程序流程图

预习要求

  1. 根据图 2图 3编写中断方式输入的主程序和中断服务程序。

  2. 根据图 4编写允许嵌套的中断服务程序。

实验任务

调试通过所编写的输入输出程序。

1. 查询方式输入

清单 1的汇编语言源程序通过实验软件输入模型计算机,以指令单步方式运行程序。TEST R0,FF03H 指令运行前,通过拨动开关设置输入数据并记录,按下PB0按键将开关数据保存在接口数据寄存器中,TEST 指令运行后观察PSW的ZF标志位的值并记录,下一条 JZ `L3 指令应根据ZF值决定是否转移。运行到 SHL R0 指令时,观察红色指示灯L15-0的状态与拨动开关设置的输入数据是否一致,以及哪一个绿色指示灯点亮。

第二次执行到 TEST R0, FF03H 指令时,观察R0的值是多少,分析测试的是哪一个输入接口的状态;TEST 指令运行后PSW的ZF标志位的状态反映了该输入接口有没有数据输入,分析运行结果是否正确。

继续以指令单步方式运行程序,通过开关按键设置输入数据,观察相关寄存器和指示灯的变化,理解查询输入程序。

2. 中断方式输入

将编写的主程序和中断服务程序通过实验软件输入模型计算机,复位后通过拨动开关设置输入数据并记录,按下某一按键产生中断请求。以指令单步方式执行一条指令后,观察REQ的值,注意其中哪一位为1;观察INTR的值,分析CPU是否收到中断请求;观察IE的值,分析CPU是否允许中断。在运行到EI开中断指令时,查看并记录主存0000H~0003H单元的内容,这些单元存放的是中断向量,即中断服务程序的入口地址。在开中断指令执行后,再次观察IE的值,分析此时是否允许中断。

继续单步执行一条指令,观察此时程序转向的地址,是不是所按按键的中断服务程序,观察并记录此时堆栈指针SP的值,查看并记录主存中堆栈相关内容,是否与断点地址和当前PSW值相符。通过上述数据,加深理解《计算机组成原理》所学的中断隐指令完成的五个操作。

在中断服务程序中,将开关输入数据输出到红色指示灯L15-0显示,该指令执行后,观察REQ值的变化,分析表明外设中断请求是否已被清除。执行中断返回指令RETI前,观察红色指示灯L15-0和绿色指示灯的状态。中断返回后, 观察并记录IE、SP和PC的值,分析中断返回指令RETI所完成的操作。

复位重新运行程序,在开中断指令执行前,依次按下4个按键“同时”产生4个中断请求,观察中断服务程序的执行顺序,返回主程序时LED指示灯的状态。

3. 中断嵌套

参考图 4流程图,如果要允许中断嵌套,必须在中断服务程序中开中断;开中断前必须设置屏蔽字;设置屏蔽字时,应该使只有优先级比自己高的中断请求才能够被响应,所以屏蔽优先级比自己高的中断,并且必须屏蔽自身。

将编写的允许嵌套的中断服务程序(屏蔽字的设置与硬件优先级一致)通过实验软件输入模型计算机。复位后通过拨动开关设置输入数据,按下PB0和PB3产生中断请求;以指令单步方式运行程序,在开中断指令执行之后,观察程序转向是否转向PB0的中断服务程序;在设置屏蔽字之后,观察PB3的中断请求信号是否被屏蔽(INTR是否有效),也就是有没有中断请求向CPU提出;开中断之后继续在PB0中断服务程序中执行,中断返回后,观察屏蔽字是否恢复,PB3的中断请求是否得以传递给CPU。

复位重新运行程序,在开中断指令执行前,按下PB3按键产生中断请求;在进入PB3中断服务程序后再按下PB0。观察程序的执行以及MASK、REQ、INTR等信号的变化。

复位重新运行程序,在开中断指令执行前,按下4个按键产生4个中断请求;继续单步运行,观察4个中断服务程序的执行顺序。

4. 通过屏蔽字改变优先级

如果要将软件处理优先级改为3→1→0→2,屏蔽字的设置填入下表。

中断源

屏蔽字

3

2

1

0

输入接口0

输入接口1

输入接口2

输入接口3

按照上表改变前面中断服务程序中的屏蔽字的设置,使得软件处理优先级与硬件响应优先级不一致。复位后通过拨动开关设置输入数据,按下PB0和PB3产生中断请求;以指令单步方式运行程序,在开中断指令执行之后,观察程序转向转向PB0的中断服务程序;在设置屏蔽字之后,观察PB3的中断请求信号是否被屏蔽(INTR是否有效),也就是有没有传递给CPU。

分析上述过程是否正确,即:在PB0和PB3同时有中断请求时,首先按照硬件优先级排队响应PB0的中断请求;但进入中断服务程序开中断之后又会被PB3中断,实际先完成的是PB3的中断服务程序,也就是PB3的软件处理优先级高于PB0的。

复位重新运行程序,在开中断指令执行前,按下4个按键产生4个中断请求;继续单步运行,观察中断服务程序的执行顺序。