Приведем текст программы с комментариями.
TITLE Возврат данных из процедуры через стек.
;Программа сделана как EXE-файл.
;-------------------------------
EXTRN Vvod:FAR,Vyvod:FAR,Clear:FAR,Write_Str:FAR,Cursor:FAR
;----- Сегмент стека
StackSg SEGMENT PARA STACK 'Stack'
DW 256 DUP(?)
StackSg ENDS
;----- Сегмент данных
DataSg SEGMENT PARA PUBLIC
STR1 DB "Задайте значение x: $"
STR2 DB "Результат: $"
DataSg ENDS
;----- Сегмент кода
CodeSg SEGMENT PARA PUBLIC
ASSUME CS: CodeSg, DS:DataSg, SS: StackSg
Begin PROC FAR
;Пролог EXE-файла.
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DataSg
MOV DS,AX
;Конец пролога.
CALL Clear ;Очистка экрана.
MOV DX,0000h
CALL Cursor ;Установка курсора.
LEA DX,STR1
CALL Write_Str ;Вывод строки.
CALL Vvod ;Ввод числа.
CMP BX,-7 ;Сравним BX с -7.
JLE M1 ;Если меньше или равно, то переход на метку M1.
;---------------- Следующие действия будут выполнены,
;---------------- при значении, большем -7.
CMP BX,6
JG M2 ;Если больше 6, то переход на метку M2.
;---------------- Здесь -7<x<=6.
ADD BX,BX
SUB BX,4
JMP M3 ;Переход на вывод результата.
M2:
CMP BX,13 ;Сравним BX с 13
JGE M1 ;Если больше или равно, то переход на метку M1.
;---------------- Здесь 6<x<13.
MOV CX,BX
ADD BX,BX
ADD BX,CX
SUB BX,15
JMP M3 ;Переход на вывод результата.
M1:
;---------------- Реализация последнего случая.
ADD BX,10
;---------------- Вывод результата.
M3:
MOV DX,0100h
CALL Cursor ;Установка курсора.
LEA DX,STR2
CALL Write_Str ;Вывод строки.
CALL Vyvod
MOV AH,1 ;Задержка.
INT 21h
RET
Begin ENDP
CodeSg ENDS
END Begin