10. Подпрограммы. Объявление, вызов. - mRrvz/bmstu-asm GitHub Wiki

Описание подпрограммы

имя_подпрограммы PROC [NEAR | FAR] ; по умолчанию NEAR, если не указать
    ;тело подпрограммы; 
    ret [кол-во используемых локальный переменных] ; ничего не указывается, если не использовались локальные переменные на стеке
имя_подпрограммы ENDP

Вызов подпрограммы

; вызов любой (в плане расстояния) подпрограммы
call имя_подпрограммы

CALL - вызов процедуры, RET - возврат из процедуры

CALL <операнд>

  • Сохраняет адрес следующей команды в стеке (уменьшает SP и записывает по его адресу IP либо CS:IP, в зависимости от размера аргумента)
  • Передаёт управление на значение аргумента.

RET/RETN/RETF <число>

  • Загружает из стека адрес возврата, увеличивает SP
  • Если указан операнд, его значение будет дополнительно прибавлено к SP для очистки стека от параметров

Отличие RETN и RETF в том, что 1ая команда делает возврат при ближнем переходе, 2ая - при дальнем (различие в кол-ве байт, считываемых из стека при возврате). Если используется RET, то ассемблер сам выберет между RETN и RETF в зависимости от описание подпрограммы (процедуры).

BP – base pointer

  • Используется в подпрограмме для сохранения "начального" значения SP
  • Адресация параметров
  • Адресация локальных переменных

(подробнее см. стек)

⚠️ **GitHub.com Fallback** ⚠️