中断源:能引起中断的事件或原因。
中断请求:是外设通过硬件信号的形式、向处理器引脚发送有效请求信号。 中断响应:中断响应是在满足一定条件时,处理器进入中断响应总线周期。 关中断:禁止处理器响应可屏蔽中断。 开中断:允许处理器响应可屏蔽中断。 中断返回:处理器执行中断返回指令,将断点地址从堆栈中弹出,程序返回断点继续执行原来的程序。 中断识别:处理器识别出当前究竟是哪个中断源提出了请求,并明确与之相应的中断服务程序所在主存位置。
中断优先权:为每个中断源分配一级中断优先权,即系统设计者事先为每个中断源确定处理器响应他们的先后顺序。
中断嵌套:在一个中断处理过程中又有一个中断请求被响应处理,称为中断嵌套。 中断处理:接到中断请求信号后,随之产生的整个工作过程,称中断处理。 中断服务:指处理器执行相应的中断服务程序,进行数据传送等处理工作。 〔习题7.13〕
按照图7-10所示的中断查询接口与相应的流程图,编写用于中断服务的程序段。具体要求是,当程序查到中断设备0有中断请求(对应数据线D0),它将调用名为PROC0的子程序;如此,依次去查中断设备1~中断设备3,并分别调用名为PROC1~PROC3的子程序。 〔解答〕
status: done:
sti push ax push dx …
mov dx,4000h in al,dx test al,01h jnz service0 test al,02h jnz service1 test al,04h jnz service2 test al,08h jnz service3 … jmp done jmp done jmp done jmp done …… pop dx pop ax iret
service0: call proc0 service1: call proc1 service2: call proc2 service3: call proc3
〔习题7.14〕
什么是DMA读和DMA写?什么是DMA控制器8237A的单字节传送、数据块传送和请求传送? 〔解答〕
DMA读:存储器的数据在DMA控制器控制下被读出传送给外设。
- -45
DMA写:外设的数据在DMA控制器控制下被写入存储器。
单字节传送方式:每次DMA传送时仅传送一个字节。传送一个字节之后,DMA控制器释放系统总线,将控制权还给处理器。
数据块传送: DMA传送启动后就连续地传送数据,直到规定的字节数传送完。
请求传送:DMA传送由请求信号控制。如果请求信号一直有效,就连续传送数据;但当请求信号无效时,DMA传送被暂时中止。 〔习题7.15〕
IA-32处理器何时处于开中断状态、何时处于关中断状态?
〔解答〕
在IA-32处理器中,若IF=1,则处理器处于开中断状态。
若IF=0,则处理器处于关中断状态。IF=0关中断的情况有:系统复位后,任何一个中断(包括外部中断和内部中断)被响应后,执行关中断指令CLI后。 〔习题7.16〕
简述IA-32处理器的中断工作过程。
〔解答〕
IA-32处理器获得向量号识别出中断源后,中断或异常接着的工作过程如下:
(1)将标志寄存器EFLAGS压入堆栈,保护各个标志位;将被中断指令的逻辑地址(代码段寄存器和指令指针寄存器内容)压入堆栈,保护断点。
(2)如果有错误代码,将其压入堆栈(有些异常产生错误代码,更具体地表明产生异常的原因)。实地址方式的异常不返回错误代码。
(3)根据向量号获得中断服务程序(中断或异常的处理程序)的段选择器和指令指针,分别传送给代码段寄存器CS和指令指针寄存器EIP。
(4)对于中断,要设置中断允许标志IF为0,即禁止进一步的可屏蔽中断。
(5)控制转移至中断服务程序入口地址(首地址),开始执行中断或异常处理程序。
中断服务程序最后是中断返回指令IRET。中断返回指令IRET将断点地址和标志寄存器出栈恢复,如果压入了错误代码还需要相应增量堆栈指针,于是控制又返回到断点指令继续执行。 〔习题7.17〕
IA-32处理器的中断向量表和中断描述符表的作用是什么?
〔解答〕
IA-32处理器的中断向量表和中断描述符表的作用都是获取中断服务程序的入口地址(称为中断向量),进而控制转移到中断服务程序中。 〔习题7.18〕
说明如下程序段的功能:
cli mov ax,0 mov es,ax mov di,80h*4
mov ax,offset intproc ; intproc是一个过程名 cld
mov es:[di],ax mov ax,seg intproc mov es:[di+2],ax sti
〔解答〕
设置80H号中断向量。 〔习题7.19〕
中断控制器8259A中IRR,IMR和ISR三个寄存器的作用是什么?
- -46
〔解答〕
中断请求寄存器IRR:保存8条外界中断请求信号IR0~IR7的请求状态。Di位为1表示IRi引脚有中断请求;为0表示该引脚无请求。
中断屏蔽寄存器IMR:保存对中断请求信号IR的屏蔽状态。Di位为1表示IRi中断被屏蔽(禁止);为0表示允许该中断。
中断服务寄存器ISR:保存正在被8259A服务着的中断状态。Di位为1表示IRi中断正在服务中;为0表示没有被服务。
〔习题7.20〕
下面是IBM PC/XT机ROM-BIOS中的08号中断服务程序,请说明各个指令的作用。
int08h int08h
proc sti push ds push ax push dx ?? ?? int 1ch mov al,20h out 20h,al pop ax pop dx pop ds iret endp
; 日时钟计时 ; 控制软驱马达
〔解答〕
int08h int08h
proc far sti push ds push ax push dx ?? ?? int 1ch mov al,20h out 20h,al pop ax pop dx pop ds iret endp
; 中断返回 ; 恢复现场 ; 日时钟计时 ; 控制软驱马达 ; 调用1CH号中断 ; 发送EOI中断结束命令 ; 远过程 ; 开中断 ; 保护现场
〔习题7.21〕
编写一个程序,将例题7-5的INT 80H内部中断服务程序驻留内存。然后在调试程序中或其他程序中执行INT 80H,看能否实现其显示功能。 〔解答〕
new80h
; 代码段 jmp start
; 80H内部中断服务程序:显示字符串(以0结尾);DS∶DX=缓冲区首地址 proc sti
; 过程定义 ; 开中断
- -47
new1: new2: intmsg new80h start: tsrmsg
push ax push bx push si
mov si,offset intmsg mov al,cs:[si] cmp al,0 jz new2 mov bx,0 mov ah,0eh int 10h inc si jmp new1 pop si pop bx pop ax iret endp ; 主程序 mov ax,cs mov ds,ax
mov dx,offset new80h cli
mov ax,2580h int 21h sti
mov eax,offset tsrmsg call dispmsg mov dx,offset start add dx,15 shr dx,4 mov ax,3100h int 21h
; 保护寄存器
; 获取欲显示字符 ; 为“0”结束
; 采用ROM-BIOS调用显示一个字符
; 显示下一个字符 ; 恢复寄存器
; 中断返回
; 字符串(以0结尾)
; 中断服务程序结束
db 'A Instruction Interrupt !',0dh,0ah,0
; 设置04H中断向量
; 显示安装信息
; 计算驻留内存程序的长度
; 调整为以“节”(16个字节)为单位 ; 程序驻留,返回DOS
db 'INT 80H Program Installed ! ',0dh,0ah,0
〔习题7.22〕
完成例题7-2显示当前日期同样的功能,请获得日期数据后转换成ASCII码,保存在缓冲区、利用DISPMSG子程序显示。 〔解答〕
; ex0722.asm in DOS date start:
mov ebx,11 mov al,9 out 70h,al in al,71h mov dl,al shr al,4
; 转换高位BCD码为ASCII码
; AL=9(准备从9号单元获取年代数据)
; 从70H的I/O地址输出,选择CMOS RAM的9号单元 ; 从71H的I/O地址输入,获取9号单元的内容,保存在AL
include io16.inc .data
byte 'Today is 20xx-yy-zz',0 .code
- -48