Я хотел бы знать, в чем разница между возвратом из прерывания (RTI) и возвратом из подпрограммы (RTS). Являются ли оба одинаковыми или есть какая-то разница между этими двумя?
Разница между возвратом из прерывания (RTI) и возвратом из подпрограммы (RTS)
Ответы (7)
Обычно возврат из прерывания восстанавливает флаги, чтобы прерванный код мог продолжать выполняться правильно. Возврат из подпрограммы не требуется, эта инструкция намеренно используется в этом потоке кода и известно, что флаги уничтожаются или не уничтожаются в зависимости от архитектуры. В архитектурах, использующих стек для адреса возврата, это очень заметно. Возврат из прерывания вытолкнет флаги, а затем адрес возврата, а возврат из подпрограммы вытолкнет только адрес возврата.
Когда на x86 происходит аппаратное прерывание, флаги и сегмент кода возврата + смещение помещаются в стек. Затем прерывания отключаются. Это нужно для того, чтобы подготовить подпрограмму прерывания для обслуживания прерывания: переключить стеки или что-то еще, что она хочет сделать, прежде чем повторно разрешить прерывания и еще немного обработать до/или возврата из прерывания. Команда iret выталкивает ранее сохраненные флаги (включая флаг прерывания, который был изначально включен) и место возврата, так что прерванная процедура может продолжать обработку, не мудрено.
Что ж, прерывания хранятся в другом сегменте кода, поэтому RTI вызываются с дальним вызовом, в то время как подпрограммы обычно остаются в том же сегменте кода, что и основная программа, поэтому они вызываются с ближним вызовом. -вызов. Разница в том, что дальние вызовы передают сегмент и смещение в качестве обратного адреса, в то время как ближние вызовы передают только смещение.
Тот факт, что процессор обрабатывает прерывание, отмечается одним или несколькими флагами в регистре состояния процессора.
Это необходимо, например. для маскировки других потенциальных прерываний.
Чтобы сообщить процессору, что обработка прерывания завершена и флаг можно сбросить, используется инструкция RTI вместо просто RTS.
Конечно, детали зависят от конкретного процессора.
RET просто вытолкнет два байта в PC (низкий адрес и старший адрес). RETI сбросит триггер разрешения прерывания, и два байта будут извлечены из стека.
RTE или RTI берут минимальный контекст из вершины стека, в то время как RTS берет обратный адрес (из вершины стека).