Каждая подпрограмма должна содержать минимум одну команду возврата RET, которая возвращает управление вызывающей программе. Такая передача управления осуществляется путем извлечения из стека адреса возврата, включенного в него командой вызова подпрограммы. Таким образом, команда возврата не содержит никакой адресной информации, неявно адресуя вершину стека.
В соответствии с типом команды вызова необходимо применять команды возвратов двух типов: внутрисегментная и межсегментная.
Однобайтная команда RET c КОП C3 реализует внутрисегментный возврат. Ее действия заключаются в том, что верхнее слово стека передается в IP, а содержимое указателя стека SP увеличивается на 2.
Однобайтная команда RET с КОП CB осуществляет межсегментный возврат. Ее выполнение сводится к следующим действиям:
1) Слово из вершины стека передается в IP;
2) Производится инкремент SP на 2;
3) Слово из новой вершины стека передается в регистр CS;
4) Производится инкремент SP на 2;
Пример:
SP:= 1080
SS:= A900
(AA080) = 3740
(AA082) = 57A8
RET (CB)
IP:= (EAS)
EAS = SP + (SS)0 = 1080 + A9000 = AA080
IP:= (AA080)
IP:= 3740
SP:=(SP) + 2 = 1080 + 2 = 1082
CS:= (EAS)
EAS = SP +(SS)0 = 1082 +A9000 = AA082
CS:= (AA082) = 57A8
SP:= (SP) +2 = 1082 +2 = 1084
Трехбайтные команды RET содержат два байта данных интерпретируемых как беззнаковое целое. Они производят точно такие же действия, как однобайтные команды возврата, но дополнительно прибавляют содержащиеся в них данные к указателю стека SP (после извлечения из стека адреса возврата).