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

Where the program counter goes after returning the interrupt handler?

你好我想知道当程序return来自中断服务程序时程序计数器会去哪里?我知道当中断事件发生时,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 return 之后)? 我希望你明白了。

由于在 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 
...

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

当一条指令正在执行时,程序计数器会保存下一条要执行的指令的地址。当中断发生时,处理器执行以下操作:

  • 暂停正在执行的程序的执行并保存其上下文。 表示保存下一条要执行的指令的地址,即程序计数器的值和其他相关数据。

  • 用该中断处理程序例程的起始地址更新程序计数器。

当中断处理例程完成后,CPU 可以在中断点恢复程序的执行。

在指令 i 处发生中断,完成后用户程序从 i+1 指令恢复执行。

有两种类型的中断: a) 软件中断- 由于一些关键问题引起的,例如在程序中执行指令(比如第 i 条指令)期间被零除(比如程序是 Divide 2 number)。

How is this handled by CPU?

非常像 Java 中的异常。 在这种情况下,立即处理中断请求(当前第 i 条指令未完成)。 当前 PC 值(指向第 i+1 条指令的地址)保存在某个位置。 中断被处理,服务中断后,returns 执行分割程序完成第 i+1 条指令和其余指令。

b) 硬件中断 - 当某些输入来自键盘(例如)或其他硬件时,处理器是 运行 程序。

How is this handled by CPU?

此时CPU不会立即响应中断请求,它先完成当前第i条指令的执行,将PC当前值(指向第i+1条指令的地址)保存在某个位置. 然后它监听那个中断,完成它,然后回到旧的程序指令 i+1 。