Это зависит от компилятора, ОС и процессора.
Для низкоуровневых встроенных компонентов, где ISR может вызываться непосредственно в ответ на прерывание, компилятор обычно имеет некоторое расширение к языку(обычно C или C ++), который помечает данную подпрограмму как ISR, и регистры будут сохраняться и восстанавливаться в начале и в конце такой подпрограммы.[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
}