问题描述
|
这整天困扰着我。当程序设置为在收到某个中断时调用函数时,我知道程序中断时寄存器会被推入堆栈,但我不知道的是:寄存器如何下车堆栈?我知道编译器不知道该函数是否是中断处理程序,也不知道该中断给该函数提供了多少个参数。那么到底是如何使寄存器消失的呢?
解决方法
这取决于编译器,操作系统和CPU。
对于底层嵌入式程序,可以直接响应中断而调用ISR,编译器通常会对将给定例程标记为ISR的语言(通常为C或C ++)进行某种扩展,并保存寄存器并保存。在此类例程的开始和结束时恢复。 [1]
对于常见的台式机/服务器操作系统,尽管通常在中断和用户代码之间有一定的抽象级别-中断通常在传递给用户例程之前先由某些内核代码处理,在这种情况下,内核代码将负责保存和恢复寄存器。 ,并且用户提供的ISR没有什么特别的。
[1]例如Keil 8051 C编译器:
void Some_ISR(void) interrupt 0 // this routine will get called in response to interrupt 0
{
// compiler generates preamble to save registers
// ISR code goes here
// compiler generates code to restore registers and
// do any other special end-of-ISR stuff
}