Не существует последней инструкции программы.
ЦП будет продолжать извлекать инструкции - следуя по любому пути, указанному в этих инструкциях.
В некоторых архитектурах есть специальные инструкции для остановки ЦП - это либо постоянная остановка (так что прерывания больше не обслуживаются) или временная остановка.
В последнем случае, когда ЦПУ возобновляет работу, он снова начнет извлекать инструкции из той, что после остановки, и программа должна знать об этом.
В случае выполнения программывнутри операционной системы, когда программа завершает свою работу, она должна уведомить ОС о таком состоянии (это может быть так же просто, как сделать возврат), чтобы она могла «указать» ЦПУ на другую программу.
Сама ОС никогда не заканчивается, онаничего не нужно делать, запланирована фиктивная задача - обычно та, которая останавливает процессор до следующего прерывания.
Существуют ситуации, когда прерывание не должно происходить (например, в начале обработки другого прерывания) - в этом случаеони отключены.
Проще говоря, в худшем случае программа должнавращение в цикле (while (1);
), чтобы процессор не извлекался за конец кода.
На уровне архитектуры прерывания обслуживаются на границах инструкций, то есть после окончания «последней» инструкции и до «следующей».
Некоторые архитектуры могут не реализовывать это, но это совсем другоешарик воска.
Таким образом, когда подается прерывание, состояние ЦП всегда архитектурно определяется.
Поскольку прерывание не может быть обработано во время инструкции ret
вызова, а скорее до или после возвратаадрес либо указывает на сам ret
(если прерывание подается до), либо на инструкцию после вызова (если это сервер после).