Приведем текст программы с комментариями.
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