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

4 回答 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 
...
于 2015-03-05T15:34:33.033 回答
2

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

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

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

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

在此处输入图像描述

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

于 2015-03-05T16:02:29.030 回答
1

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

于 2015-03-05T15:39:16.207 回答
1

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

CPU是如何处理的?

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

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

CPU是如何处理的?

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

于 2015-12-31T14:44:27.940 回答