在中断处理程序返回后,程序计数器会去哪里?

3

你好,我想知道当程序从中断服务例程返回时,程序计数器会去哪里?我知道当中断事件发生时,PC会被推入堆栈中。但是下一个地址还是刚执行的那个地址会被推入堆栈中呢?

first instruction;
interrupt event here;
go inside the ISR;
exit ISR;
second instruction;

或者

first instruction;
interrupt event here;
go inside the ISR
exit ISR;
first instruction;

我是说,PC指向的是ISR进入之前执行的指令,还是它会跳转到下一条指令(在从ISR返回后)?希望你能理解我的意思。

4
这与C语言有什么关系? - OldProgrammer
CPU会推送下一条指令的返回地址,该指令应在函数调用后执行。或者说:将程序计数器推入堆栈并将其增加一条指令。 - Lundin
这主要取决于具体的中断/异常类型。例如:陷阱/系统调用/软件中断显然会推送下一条指令的地址,但是页故障/TLB失效异常会推送有问题的指令的地址以便重试。 - ninjalj
另一个中断返回到第一条指令的情况可能发生在X86重复指令序列中,如 | rep movsb |,但这是因为PC直到重复指令序列完成之前都不会被推进。中断将在当前重复序列的迭代完成后发生(寄存器在中断发生之前更新)。 - rcgldr
4个回答

4

由于在CPU处于精确固定状态之前无法处理中断,因此如果中断在指令执行的中间被引发,则跳转到中断向量过程将在指令执行完成后发生。

因此,当从中断过程返回时,PC将指向第一个指令后面的指令。

first instruction fetch (PC is updated meanwhile)
first instruction decode
interrupt is raised
first instruction execution
** now and only now the CPU checks for a possible interrupt **
interrupt is present, pushing PC on stack and other things
jump to interrupt address
execution of interrupt
return from interrupt (pop of PC and other things)
second instruction fetch 
...

不是关于上面问题的,但我有一个疑问: 在设置中断器期间,程序计数器寄存器被推送到监管员堆栈上,因此当中断例程完成时,RTI指令知道处理器应处于什么状态以恢复执行中断代码? - Nagesh Mhapadi

2
当一条指令正在执行时,程序计数器会保留下一条要执行的指令的地址。当发生中断时,处理器会执行以下操作:
  • 暂停正在执行的程序并保存其上下文。这意味着它会保存下一条要执行的指令的地址,即程序计数器的值和其他相关数据。
  • 使用中断处理程序例程的起始地址更新程序计数器。
当中断处理程序例程完成后,CPU可以在中断点恢复程序的执行。
中断发生在指令处,完成后用户程序从指令继续执行。 enter image description here

请注意,有时下一条指令是相同的指令(但具有不同的寄存器值),例如序列 | rep movsb |。 - rcgldr

1

中断的确切行为是硬件特定的,但CPU将简单地等待直到first_instruction完成。之后,它将把CPU状态推入堆栈(或以其他方式保存)并启动ISR。这意味着您的ISR不会立即执行 - 存在微小延迟,这可能成为硬实时应用程序中的问题。


1
有两种类型的中断: a)软件中断- 由于程序(例如Divide 2 number)中执行指令(第i个指令)期间出现诸如除以零之类的严重问题而引起。
CPU如何处理这种情况? 非常类似于Java中的异常。 在这种情况下,立即处理中断请求(当前第i个指令没有完成)。 将当前PC值(指向第i+1个指令的地址)保存在某个位置。 处理中断,服务中断后,返回执行除法程序以完成i+1 th指令和其余指令。
b)硬件中断-当键盘(例如)或其他硬件输入到达时,处理器正在运行程序。
CPU如何处理这种情况? 在这种情况下,CPU不会立即服务中断请求。它首先完成当前第i个指令的执行,并将PC当前值(指向第i+1个指令的地址)保存在某个位置。 然后它侦听该中断,完成它,然后回到旧的程序指令i+1。

似乎有第三种中断 - (c) 故障,例如页面故障,在其中断处理程序可以尝试修复问题,然后返回以重新尝试第i条指令。 - David Cary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接