微机原理与接口技术--习题解答 下载本文

MOV 上 OUT MOV 于 INC OUT MOV OUT MOV 全嵌套

AL,11H ;控制初始化命令字ICW1设为11H,功能同

DX,AL ;设置ICW1 AL,70H ;中断类型码初始化命令字ICW2设为70H,对应;IR0~IR7的中断类型码为70H~77H DX ;取从片8259A的奇地址端口 DX,AL ;设置ICW2 AL,02H ; ICW3设为02H,表示本从片与主片的IR2相连 DX,AL ;设置ICW3 AL,01H ;方式控制初始化命令字ICW4设为01H,非特殊

;方式,非缓冲方式,非中断自动结束方式,工作

;8086/8088系统中

OUT DX,AL ;设置ICW4

答:各初始化命令字的含义见注释。

7.34 8237A在进行单字节方式DMA传输和块方式DMA传输时,有什么区别?

答:区别在于:单字节方式时DMA每完成一个字节传输后,便释放系统总线,CPU

至少可占用一个总线周期。块传输方式时,只有当字节计数器减为0,从而在

EOP端输出一个负脉冲或者外部I/O接口往DMA控制器的EOP端送一个低电

平信号时,8237A才释放总线而结束传输。

7.35 下面是一个常驻内存的中断服务程序框架和它的装配程序,请对此程序的注释进行补

充,以便得到一个完整的注释清单。 STACK SEGMENT ;设置堆栈段

DW 256 DUP (?)

STACK ENDS

DATA 8259P0 8259P1 DATA CODE

SEGMENT EQU EQU ┆ ENDS SEGMENT ASSUME

40H 41H

;设置数据段 ;8259A的偶地址端口号 ;8259A的奇地址端口号

;设置代码段

CS:CODE,DS:DATA,SS:STACK ;段说明

;程序开始,直接转START2执行 ;定义一个远过程(段外子程;开中断 ;保护现场

START1: JMP INTSUB PROC

序)INTSUB

STI PUSH PUSH PUSH PUSH PUSH PUSH ┆ POP POP POP

START2 FAR ES DS AX BX SI DI DI SI BX

;中断处理内容 ;恢复现场

INTSUB

POP POP POP MOV MOV OUT IRET ENDP AX DS ES

AL,20H DX,8259P0 DX,AL

;发一般的中断结束命令 ;取8259A偶地址 ;中断返回

;远过程定义结束 ;程序开始,取数据段的段地址送DS ;设置中断向量的系统功能调用的入START2: MOV AX,DATA

MOV DS,AX MOV AL,45H 口条件

MOV AH,25H

MOV DX,OFFSET INTSUB INT 21H MOV AL,0 断

MOV DX,8259P1 OUT DX,AL STI MOV AX,3100H 件

MOV DX,$–INTSUB INT 21H

CODE ENDS

END START1

答:注释见程序清单的下划线部分。

;设置中断向量

;OCW1=00H,开放8259A的所有中;取8259A的奇地址号 ;开中断 ;终止用户程序并驻留内存的入口条

;程序驻留退出 ;代码段结束 ;程序结束

7.36 8259A在采用边沿触发方式时,为了防止IR端有毛刺产生中断,因此通常也要求有

足够的脉冲宽度,这一点由8259A的内部性能所决定。所以,中断控制器的初始化命令字虽用边沿触发,但是,中断请求信号却是某个脉冲信号。你认为,这种情况下,设置边沿触发方式和设置电平触发方式相比,有什么优点?

答:电平触发方式时,中断请求信号必须在第一个INTA脉冲结束之前保持高电平,

而此时的中断请求信号却是某个脉冲信号,不一定能满足电平触发方式的要求,可能会造成中断请求得不到响应。而此信号能满足边沿触发方式对中断请求信号的要求,可基本保证能得到中断响应(IF=1)。 7.37 下面是一个8253的初始化程序段。8253的控制口地址为46H,3个计数器端口地址

分别为40H、42H、44H。在8253初始化前,先将8259A的所有中断进行屏蔽,8259A的奇地址端口为82H。请对下面程序段加详细注释,并以十进制数表示出各计数器的值。 INI: CLI ;CPU关中断 MOV AL,0FFH ;8259A屏蔽中断 OUT 82H,AL MOV AL,36H ;设置计数器0控制字,工作于模式3 OUT 46H,AL MOV AL,0 ;设置计数器0的计数初值为4000H=16384 OUT 40H,AL MOV AL,40H OUT 40H,AL MOV AL,54H ;设置计数器1控制字,工作于模式2,低8位字节读/写 OUT 46H,AL MOV AL,18H ;设置计数器1的计数初值为18H=24 OUT 42H,AL

MOV AL,0A6H ;设置计数器2控制字,工作于模式3,高8位字节读/写 OUT 46H,AL MOV AL,46H ;设置计数器2的计数初值为4600H=17920 OUT 44H,AL MOV AL,80H ;修改计数器2的计数初值为8000H=32768 OUT 44H,AL

答:注释见程序清单,计数器初值的十进制值也见注释。

7.38 下面是一个用8253作为定时器的发音程序,程序中已加了部分注释。请对8253的有

关程序段加上注释,并画出整个程序的流程图。8253的控制口地址为46H,3个计数器端口地址分别为40H、42H、44H。8255A的B端口接扬声器驱动电路,B端口的地址为62H。

SOUND: PUSHF

CLI OR DH,DH ;DH中为发长音的个数 JZ K3 ;如不发长音,则转K3

K1: MOV BL,6 ;如发长音,则置长音计数器

CALL BEEL ;调用发音程序

K2: LOOP K2 ;两音之间留一点间隙

DEC DH ;长音发完否 JNZ K1 ;否,则继续

K3: MOV BL,1 ;如发完长音,则置短音计数器

CALL BEEL ;调用发音程序

K4: LOOP K4 ;两音之间留一点间隙

DEC DL ;继续发短音吗 JNZ K3 ;是,则继续

K5: LOOP K5 ;否,则留一点间隙

POPF ;标志恢复 RET ;返回

BEEL: MOV AL,B6H ;发音子程序开始

OUT 46H,AL ;8253的计数器2工作于模式3 MOV AX,533H ;计数初值为533H OUT 44H,AL ;送初值低位 MOV AL,AH OUT 44H,AL ;送初值高位 IN AL,62H ;取扬声器驱动信息 MOV AH,AL OR AL,03 ;接通扬声器 OUT 62H,AL ;扬声器驱动 SUB CX,CX ;一次发音时间设定

K7: LOOP K7

DEC BL ;BL中为发音计数值 JNZ K7 ;如未结束,则继续发音 MOV AL,AH ;如发音结束,则恢复B端口信息 OUT 62H,AL RET

答:补充的注释见程序清单中的下划线部分。程序流程图如下所示。

SOUND开始 保护标志,关中断 发长音吗? Y N 置长音计数器,调发音子程序,并延时 N 长音发完吗? Y 置短音计数器,调发音子程序,并延时 N 短音发完吗? Y 延时并恢复标志 RET返回 BEEL开始 8253计数器2初始化为模式3,计数初值为533H 取扬声器驱动信息并送AH中保护起来 接通扬声器并使其发音 延时 音发完了吗? N Y 发音结束,关掉扬声器 RET返回