Команда передает управление процедуре (подпрограмме), сохранив перед этим в стеке адрес возврата. Команда RET, которой обычно заканчивается процедура, забирает из стека адрес возврата и возвращает управление на команду, следующую за командой CALL. Команда CALL имеет четыре модификации:
- вызов прямой ближний (в пределах текущего программного сегмента);
- вызов прямой дальний (вызов процедуры, расположенной в другом программном сегменте);
- вызов косвенный ближний;
- вызов косвенный дальний.
Команда CALL прямого ближнего вызова заносит в стек смещение точки возврата в текущем программном сегменте и модифицирует IP так, чтобы в нем содержалось смещение точки перехода в том же программном сегменте. Необходимое для вычисления этого смещения расстояние до точки перехода содержится в коде команды, который занимает 3 байта (код операции T8h и смещение к точке перехода).
Команда CALL прямого дальнего вызова заносит в стек два слова – сначала сегментный адрес текущего программного сегмента, а затем (выше, в слово с меньшим адресом) смещение точки возврата в текущем программном сегменте. Далее модифицируются регистры IP и CS: в IP помещается смещение точки перехода в том сегменте, куда осуществляется переход, а CS – сегментный адрес этого сегмента. Обе эти величины берутся из кода команды, который занимает % байтов (код операции 9Ah, относительный адрес вызываемой процедуры и её сегментный адрес).
Косвенные вызовы отличаются тем, что адрес перехода извлекается не из кода команды, а из ячеек памяти или регистров; в коде команды содержится информация о том, где находится адрес перехода.