微机期末复习,整理了一些课本例题,看着例题复习能加深概念的理解。希望对大家也有帮助~
8259A中断控制器:
1、在IBM PC机中,从BUF区开始的数据缓存区中放有100个字符的字符串,中断请求信号通过IRQ2输入,每中断一次通过27FH地址端口输出一个字符,字符串全部输出后返回操作系统。
程序源如下:
;主程序
DATA SEGMENT
BUF DB 100 DUP(?) ;缓冲区
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA ;设置段寄存器
START:
MOV AX, DATA
MOV DS, AX ;设置DS
;设置中断向量
PUSH DS ;入栈保存DS
MOV AX, SEG INTPR ;中断向量段地址存入DS
MOV DS, AX
MOV DX, OFFSET INTPR ;中断向量偏移地址存入DX
MOV AH, 25H ;DOS调用预置功能号
MOV AL, 0AH ;预置中断类型码
INT 21H ;DOS功能调用
POP DS ;DS出栈,恢复中断前断点状态
;开放IRQ2中断
MOV DX, 021H ;设置8259A的基本地址
IN AL, DX ;将21H端口地址命令内容存入AL中
AND AL, 0FBH ;对AL设置OCW1打开IRQ2中断
OUT DX, AL ;将AL修改后的内容返回21H端口地址
MOV SI, OFFSET BUF ;SI指向BUF首地址
MOV CX, 100 ;设置循环次数
STI ;开中断IF=1
NEST: HLT ;暂停程序,等待中断
LOOP NEXT ;CX!=0,等待下一次中断
;关中断
MOV DX, 021H ;CX=0,21H端口地址内容送入AL
IN AL, DX
OR AL, 04H ;对AL内容修改(关闭IRQ2中断)
OUT DX, AL ;修改后的AL返回21H端口
MOV AH, 4CH ;DOS调用结束程序
INT 21H
;执行中断服务
INTPR: MOV AL, [SI] ;将SI指向的第一个字符存入AL
MOV DX, 27FH
OUT DX, AL ;将AL内容从27FH端口输出
INC SI ;SI指向下一个字符
MOV DX, 020H ;设置OCW2内容,关中断送入20H端口
MOV AL, 20H
OUT DX, AL
IRET ;返回主程序断点处继续执行主程序
CODE ENDS
END START
说明:CPU执行到HLT时,不断进行空操作,直到接收到中断请求INTR,才退出空操作,转到中断服务程序。
返回指令IRET具有恢复断点和标志的功能,所以在断点返回之前不用开中断。
2、在IBM PC机中,外部中断逻辑控制电路由两片8259A组成。主片端口地址为20H和21H,中断类型码为08H~0FH,从片端口地址为A0H和A1H,中断类型码为70H~77H。连接如下图:
8259A初始化程序编程:
;主8259A的初始化
MOV AL, 11H ;ICW1初始化,边沿、级联
OUT 20H, AL
MOV AL, 08H ;ICW2初始化,IRQ0中断类型码
OUT 21H, AL
MOV AL, 04H ;ICW3初始化,级联
OUT 21H, AL
MOV AL, 11H ;ICW4初始化,特殊全嵌套、普通EOI方式
OUT 21H, AL
;从片8259A初始化
MOV AL, 11H ;ICW1初始化,边沿、级联
OUT 0A0H, AL
MOV AL, 70H ;ICW2初始化,IRQ0中断类型码
OUT 0A1H, AL
MOV AL, 02H ;ICW3初始化,连接主的IRQ2
OUT 0A1H, AL
MOV AL, 01H ;ICW4初始化,普通全嵌套方式、普通EOI方式
OUT 0A1H, AL
;级联编程
;读ISR内容
MOV AL, 0BH ;OCW3初始化,读取ISR内容
OUT 0A0H, AL
NOP ;延时,等待8259A操作结束
IN AL, 0A0H ;读取ISR存入AL
;从片发EOI命令
MOV AL, 20H ;从片写入EOI命令
OUT 0A0H, AL
;主片发EOI命令
MOV AL, 20H ;主片写入EOI命令
OUT 20H, AL
8255A并行接口芯片
例:8255A工作于方式0,作为用查询方式工作的并行打印机的接口。写出打印子程序。
BUSY=1表示打印机在忙。只有当BUSY=0时,才能通过8255A向打印机输出一个字符。
现在,A口传送字符、工作方式0、输出方式。B口未用。C口工作方式0、高位输出、地位输入。
由图可确定8255A各端口地址
设输出字符存放在寄存器CL中,具体子程序如下:
PRINT:PUSH AX ;保护AX
MOV AL, 81H ;设置控制字,方式0、A口输出、C口低位输入
OUT 0A3H, AL
MOV AL, 0DH ;设置C口位控制字,使PC6为高电平1
OUT 0A3H, AL
WAITO:IN AL, 0A2H ;检测BUSY是否为0
AND AL, 04H
JNZ WAITO ;BUSY=1则跳转
MOV AL, CL ;字符送入A端口
OUT 0A0H, AL
MOV AL, 0CH ;PC6一个负脉冲执行打印操作
OUT 0A3H, AL
INC AL
OUT 0A3H, AL
POP AX
RET