Команда вызова подпрограммы CALL передает управление с автоматическим сохранением адреса возврата в стеке. В поле операнда этой команды находится метка первой команды вызываемой подпрограммы.
При переходе к подпрограмме необходимо временно запомнить адрес команды, находящейся после команды CALL. Этот адрес называется адресом возврата. После того, как подпрограмма закончит свои действия, завершающая ее команда возврата RET передает управление по запомненному адресу возврата. Адрес возврата запоминается в стеке.
Вызовы могут быть внутрисегментными (тип NEAR) или межсегментными (тип FAR). В первом случае вызываемая подпрограмма находится в текущем сегменте кода, а во втором – в произвольном участке памяти.
Команды внутрисегментного перехода производят декремент SP на 2, включают в стек содержимое IP, а затем прибавляют к IP 16-битное смещение, которое интерпретируется как знаковое целое. Команды межсегментного перехода производят декремент SP на 2, включают в стек содержимое CS, снова производят декремент SP на 2, включают в стек содержимое IP, затем в IP загружается значение смещения, а в CS - сегментный адрес.
Формат команды:
CALL disp – непосредственный ближний вызов;
CALL mem/reg – косвенный ближний вызов;
CALL addr – непосредственный дальний вызов;
CALL mem – косвенный дальний вызов.
Каждая подпрограмма должна содержать минимум одну команду возврата RET, которая возвращает управление вызывающей программе. Такая передача управления осуществляется путем извлечения из стека адреса возврата, включенного в него командой вызова подпрограммы.
Команды внутрисегментного и межсегментного возврата имеют одну и ту же мнемонику RET. Тип команды, соответствующей этой мнемонике, определяется ассемблером автоматически.
Формат команды:
RET – однобайтный вариант,
RET data – трехбайтный вариант.
Однобайтная команда RET с кодом операции C3 реализует внутрисегментный возврат. Она передает слово из вершины стека в IP и увеличивает SP на 2. Синонимом данной команды является команда RETN.
Однобайтная команда RET с кодом операции CB осуществляет межсегментный возврат. Она передает слово из вершины стека в IP, увеличивает SP на 2, передает слово из вершины стека в CS и снова увеличивает SP на 2. Синонимом данной команды является команда RETF.
Трехбайтные варианты команд возврата осуществляют те же действия, что и однобайтные, а затем прибавляют содержащиеся в них данные к указателю стека. Эти команды предназначены для упрощения возврата из тех подпрограмм, параметры которых передаются в стеке. Прибавление к SP данных из RET эквивалентно удалению параметров из стека.
Для того, чтобы ассемблер правильно генерировал машинный код для команды RET, используется директива объявления процедуры.