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返回