Разница между возвратом из прерывания (RTI) и возвратом из подпрограммы (RTS)

Я хотел бы знать, в чем разница между возвратом из прерывания (RTI) и возвратом из подпрограммы (RTS). Являются ли оба одинаковыми или есть какая-то разница между этими двумя?


person Amit Singh Tomar    schedule 11.03.2011    source источник


Ответы (7)


Обычно возврат из прерывания восстанавливает флаги, чтобы прерванный код мог продолжать выполняться правильно. Возврат из подпрограммы не требуется, эта инструкция намеренно используется в этом потоке кода и известно, что флаги уничтожаются или не уничтожаются в зависимости от архитектуры. В архитектурах, использующих стек для адреса возврата, это очень заметно. Возврат из прерывания вытолкнет флаги, а затем адрес возврата, а возврат из подпрограммы вытолкнет только адрес возврата.

person old_timer    schedule 11.03.2011
comment
Спасибо за ваш ответ @dwelch ..... флаг, который возвращается из всплывающего прерывания, связан с чем ??? - person Amit Singh Tomar; 13.03.2011
comment
@AMIT: флаги (содержимое слова состояния процессора), выведенные в RTI, - это те, которые были выдвинуты процессором в начале прерывания. Однако это не относится автоматически ко всем архитектурам: старые добрые архитектуры Z80 или 8051 НЕ выдвигают PSW при прерываниях. В этих случаях об этом должен позаботиться код обработчика прерываний. - person Curd; 13.03.2011
comment
@AMIT @Curd Вот почему я начал со слова «Обычно», я должен был быть немного менее тонким. Вы не указали архитектуру, поэтому я должен был быть немного общим. Архитектуры, в которых нет разницы между возвратом из прерывания и возвратом из подпрограммы, часто не имеют отдельных инструкций. когда они это делают, обычно это что-то вроде вывода слова состояния или изменения состояния внутренней защиты процессора или что-то в этом роде. - person old_timer; 13.03.2011

Когда на x86 происходит аппаратное прерывание, флаги и сегмент кода возврата + смещение помещаются в стек. Затем прерывания отключаются. Это нужно для того, чтобы подготовить подпрограмму прерывания для обслуживания прерывания: переключить стеки или что-то еще, что она хочет сделать, прежде чем повторно разрешить прерывания и еще немного обработать до/или возврата из прерывания. Команда iret выталкивает ранее сохраненные флаги (включая флаг прерывания, который был изначально включен) и место возврата, так что прерванная процедура может продолжать обработку, не мудрено.

person Olof Forshell    schedule 11.03.2011

Что ж, прерывания хранятся в другом сегменте кода, поэтому RTI вызываются с дальним вызовом, в то время как подпрограммы обычно остаются в том же сегменте кода, что и основная программа, поэтому они вызываются с ближним вызовом. -вызов. Разница в том, что дальние вызовы передают сегмент и смещение в качестве обратного адреса, в то время как ближние вызовы передают только смещение.

person BlackBear    schedule 11.03.2011

Тот факт, что процессор обрабатывает прерывание, отмечается одним или несколькими флагами в регистре состояния процессора.

Это необходимо, например. для маскировки других потенциальных прерываний.

Чтобы сообщить процессору, что обработка прерывания завершена и флаг можно сбросить, используется инструкция RTI вместо просто RTS.

Конечно, детали зависят от конкретного процессора.

person Curd    schedule 11.03.2011
comment
Я хотел бы добавить, что во многих архитектурах дополнительная информация помещается в стек, и поэтому кадр стека имеет немного другую структуру в процедуре прерывания. - person Gunther Piez; 11.03.2011
comment
Он не помечен, как вы его называете. Если это аппаратное прерывание, бит прерывания будет отключен. Однако это может быть вызвано нормальной обработкой, поэтому это не является надежным индикатором прерывания. - person Olof Forshell; 12.03.2011
comment
@Olof Forshell: Кажется, вы думаете об одной конкретной архитектуре. Поскольку AMIT не относится к конкретной архитектуре, я просто обрисовал общее поведение, которое является общим или похожим на все известные мне архитектуры. Конечно, есть больше деталей, как я уже упоминал. - person Curd; 13.03.2011

RET просто вытолкнет два байта в PC (низкий адрес и старший адрес). RETI сбросит триггер разрешения прерывания, и два байта будут извлечены из стека.

person abhilash    schedule 19.04.2011

RTE или RTI берут минимальный контекст из вершины стека, в то время как RTS берет обратный адрес (из вершины стека).

person Skar    schedule 08.01.2021

person    schedule
comment
Вопрос был о RTI и RTS, они предназначены для архитектур, отличных от x86. RET/IRET — это x86/x86-64. - person Michael Petch; 19.03.2018