Продолжаю тосковать по тем временам, “когда деревья были большими”, а программы - маленькими. Сейчас даже трудно представить, что не такая уж и никчёмная программа могла уместиться в несколько десятков байтов. Сегодня даже пустое консольное приложение, написанное на языках высокого уровня, может занимать сотни КБ.
Однако жизнь не стоит на месте. К тем временам уже не вернуться (да и не надо). Но, с другой стороны, никто нам не мешает вспомнить молодость и поразвлекаться изучением языка ассемблера. Чем я время от времени и занимаюсь. А сегодня хочу рассказать о некоторых особенностях команды RET. Подробнее о ней можно узнать по указанной выше ссылке, а здесь то, что осталось за кадром.
Итак, команда RET выполняет возврат из процедуры в вызывающую программу, или из программы в операционную систему. В случае возврата в операционную систему эта команда просто вызывает прерывание 20h (досовская команда). То есть для выхода из программы вместо RET вы можете спокойно применить INT 20h:
Об ещё одной альтернативе команде RET можно узнать здесь.
Так же есть ещё вариант использования RET - RET N, где N - это количество байтов, которые будут извлечены из стека. Эта команда и так извлекает данные из стека (адрес возврата), но если вы почему-то хотите извлечь дополнительные байты, то это можно использовать. Без указания параметра после выхода из программы регистр SP содержит значение 0FFFAh. Если сделать, например, так:
RET 1
то в этом регистре будет 0FFFBh. Это говорит о том, что указатель стека увеличился, то есть мы извлекли из него 1 байт, чего и хотели (правда, не знаем, зачем ))).
Однако для выхода из программы это в большинстве случаев смысла не имеет. А вот при выходе из процедуры может пригодиться. Если процедура работает с большим количеством параметров, то регистров просто не хватит для их передачи. Тогда можно использовать стек. И вот здесь вам эта фича пригодится - при возврате из процедуры вы сможете вытащить из стека нужные данные.
Конечно, надо будет позаботиться о том, куда эти данные выгрузить и т.п. Но это уже другая история.
Вместо мучений со стеком можно, конечно, использовать переменные. Но это увеличит размер программы и замедлит скорость её выполнения. А фишка ассемблера как раз и заключается в минимальном размере и максимальной скорости.
На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.