购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.5 中断处理

通常情况下,处理器支持某些形式的中断处理,以响应来自外部设备的服务请求。从概念上讲,中断处理类似于当正在忙于某项工作时电话响起的情况。在接听电话并记下要点后,挂断电话并恢复被中断的工作。生活中也有许多类似的机制,例如门铃和闹钟,能够让人们先响应中断优先级较高的活动请求。

3.5.1 处理

6502集成电路具有两个输入信号,用于外部组件通知处理器有服务请求。第一个输入信号是中断请求输入信号 是低电平有效输入信号( 字符上方的横线表示低电平有效),表示输入为低电平时向处理器发出中断请求。可以将此信号视为电话铃声来通知处理器当前正在有一个电话呼入。

6502无法立即响应 输入上的低电平信号。在6502开始处理中断之前,首先必须完成正在执行的指令,接下来将返回地址(正在执行的指令完成之后将要执行的下一条指令的地址)压入栈,处理器标志寄存器也入栈。由于这个中断是由 输入产生的,因此栈里处理器标志中的B标志将为0。

与JSR指令不同,响应 时压入栈的返回地址是下一条将要被执行的指令的实际地址,而不是指令地址减1。中断返回地址不会像RTS指令执行期间那样递增以生成返回地址。

在中断处理的下一阶段,处理器将 处理程序的入口地址从内存地址$FFFE~$FFFF加载到PC寄存器中,6502从该地址执行中断处理程序。中断处理程序能够识别发起中断的外围设备,并执行能够满足请求所需的处理,然后将控制权返回到中断之前正在执行的代码。

当中断处理完成后,处理器执行RTI指令。RTI指令从栈中弹出处理器标志与PC寄存器的值,并恢复执行在 输入为低电平时正在执行指令的下一条指令。

输入是可屏蔽中断,它可以实现与让电话铃声静音相同的功能。当 中断处理开始时,6502自动置位I标志,这样可以屏蔽(禁用) 输入信号,直到I标志被清除。

因为处理器开始响应 时I标志可能还没有被置位,所以I标志会被RTI指令清除。I标志也可以通过CLI指令清除,这意味着可以在处理 中断时启用 中断。处理一个中断的同时响应另一个中断的现象称为 嵌套中断 (nested interrupt)。

输入信号是由电平控制的,意味着只要 输入为低电平且I标志被清除,处理器就会启动中断处理程序。这样的结果是,在完成一个中断处理时,与6502交互的中断源必须确保 输入不再为低电平。如果在执行RTI指令时 保持低电平,则6502将立即开始新的中断处理过程。

通过 输入信号发起中断可以实现6502与外围设备之间的大多数常规交互。例如,在大多数计算机中键盘是中断源,每次按键都会产生一个 中断。在键盘中断处理期间,6502从键盘接口读取按键标识,并将其存储在队列中,以便被当前活动的应用程序进行处理。 处理程序不需要知道有关按键信息的用途,只是保存数据供以后使用。

3.5.2 处理

6502的第二个中断输入信号是 ,即不可屏蔽中断。顾名思义, 不会被I标志所屏蔽。 是下降沿触发的边沿敏感输入信号。

除了中断处理程序的入口地址是从内存地址$FFFA~$FFFB加载的且不受I标志影响外, 中断处理与 中断处理类似。

因为 是不可屏蔽中断,所以可以在任何时刻触发,包括6502在处理 中断时或者在处理较早的 中断时。

输入通常为优先级非常高的中断条件保留,因此不能延迟处理或忽略。 中断的一种可能用途是触发实时时钟的定时递增。

每次发生中断时, 处理程序会使位于地址$10~$13的32位时钟计数器递增:

需要注意的是,当在程序源代码中访问硬件信号时,可以在信号名前面使用正斜杠表示低电平有效。比如在代码注释中,/NMI表示

3.5.3 BRK指令处理

BRK指令触发一个类似于 中断的处理过程。因为BRK是一条指令,所以在启动中断处理之前不需要等待正在执行的指令完成。在执行BRK指令时,返回地址(BRK指令地址加2)和处理器标志都被压入栈,这类似于对 输入信号的低电平响应。值得注意的是,通过BRK指令地址加2,返回地址就不再指向BRK指令之后的字节,而是指向它后面的第二个字节。

BRK指令是不可屏蔽的,即I标志不影响BRK指令的执行。

BRK指令处理程序与 处理程序地址相同,位于内存地址$FFFE~$FFFF处。由于BRK指令和 共享同一个处理程序,因此在处理期间一定要根据B标志来识别中断源。在响应BRK指令时,将处理器标志中的B标志压入栈中[注意,这不是处理器标志(P)寄存器中的B标志],并且在处理 中断期间将其清除。

在大多数6502的应用中,很少使用BRK指令。这条指令的传统用法是在调试程序时设置断点。通过使用BRK指令临时替换在中断位置处的操作码字节,调试程序(在较小的计算机系统中通常称为监控器)获得控制权,并允许用户在恢复执行前显示和修改寄存器内容和内存位置。

下面的代码示例实现了一个最小的 处理程序,该处理程序可区分 中断和BRK指令。使用内存地址$14作为这个程序专用的临时存储单元:

这个例子说明了在6502体系结构中,如何区分由处理器 输入信号发起的中断和由BRK指令引起的中断。在更为复杂的处理器中,这些体系结构通常为每个中断源实现唯一的中断向量(中断处理程序入口地址),支持在指定的指令位置设置断点等调试操作。

本节介绍了6502体系结构中的指令类型,并简要说明了指令类别中的每条指令。尽管6502比现代的32位和64位处理器简单得多,但这里介绍了最常见的指令(包括支持通用中断处理的指令)和寻址方式,它们在最复杂的现代处理器中也要使用。

下一节将介绍用于处理器和外围设备之间进行数据传送的I/O处理的基础知识。 MtNX5hTO/MgIxxpOKYD28EMUR6RFYmeX1F0Aryn16gJoNqMzpj3AXF/ogOzZoit8

点击中间区域
呼出菜单
上一章
目录
下一章
×