Для любителей языка ассемблера и для тех, кто хочет докопаться до самой сути, расскажу как работает команда RET и чем её можно заменить.
Вообще эта команда выполняет выход из процедуры или программы. В первом случае управление возвращается программе, а во втором - операционной системе. Подробное описание этой команды с видео можно найти здесь.
А теперь о том, что делает эта команда. А она всего лишь навсего достаёт из стека адрес возврата, и выполняет переход по этому адресу. То есть заменить её можно двумя командами:
POP AX ; Достать из стека адрес возврата
JMP AX ; Выполнить переход на этот адрес
Ну и для наглядности рисунок, где показаны две программы, которые работают совершенно одинаково:
Зачем вообще это может понадобиться? Зависит от ваших задач. В каких-то случаях это более наглядно, в каких-то более удобно. Ну а в большинстве случаев, конечно, следует использовать обычный способ выхода из процедуры или программы.
Ну и вывод, который напрашивается из всего этого: неосторожное обращение со стеком может сделать затруднительным завершение вашей программы обычным способом:
В этом примере команда RET не сможет завершить программу. Потому что мы поместили в стек какое-то число (100 в нашем примере). Но забыли достать это число из стека. В итоге в вершине стека перед вызовом RET у нас будет число 100, которое не является правильным адресом возврата. Поэтому команда RET и не сможет передать управление операционной системе, то есть программа не завершится.
На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.