如果在执行程序的最后一条指令期间发生中断,推送到堆栈上的返回地址是什么?



计算机组织和体系结构

当在程序执行期间发生中断时,CPU执行该指令并将下一条指令的地址存储在堆栈中并为中断提供服务,然后再次使用堆栈的帮助恢复执行先前的程序指令

现在,如果CPU正在执行程序的最后一条指令,然后发生中断并且将返回地址推送到堆栈上怎么办

不存在程序的最后一个指令。

CPU将继续获取指令 - 遵循这些指令告诉它的任何路径。
某些体系结构具有停止 CPU 的特定指令 - 这是永久停止(以便不再提供中断(或临时停止。
在后一种情况下,当CPU恢复时,它将在停止后重新开始从指令中获取指令,程序必须意识到这一点。

如果程序在操作系统内执行,当程序结束时,它必须通知操作系统这种情况(可能像返回一样简单(,以便它可以将 CPU "指向"另一个程序。
操作系统本身永远不会结束,它无事可做,计划了一个虚拟任务 - 通常是停止 CPU 直到下一次中断的任务。
在某些情况下,不应发生中断(例如,在开始处理另一个中断时( - 在这种情况下,它们将被禁用。

简单来说,在最坏的情况下,程序必须循环旋转(while (1);(,以防止CPU在代码末尾获取。


在架构级别,中断在指令边界处提供服务,即在"最后一个"指令结束之后和"下一个"指令之前。
有些架构可能不会强制执行这一点,但这是一个完全不同的蜡球。
因此,当提供中断时,CPU 的状态始终在架构上定义。
由于中断不能在调用的ret指令期间提供,而是在调用之前或之后提供,因此返回地址要么指向ret本身(如果中断在之前提供(,要么指向调用之后的指令(如果它是服务器之后(。

最新更新