Приведем текст программы с комментариями.
TITLE Задача 44_1. ;Программа сделана как 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 "Задайте количество элементов массива (меньше 100): $" STR2 DB "-й элемент: $" STR3 DB "Исходный массив: $" STR4 DB " $" STR5 DB "В данном массиве нет отрицательных элементов!$" STR6 DB "Максимум среди отрицательных элементов: $" A DW 100 DUP(?) N DB ? REZ DW 1 ;Результат. 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 ;Ввод количества элементов массива. MOV N,BL ;Сохраним введенное число в N. ;------------- Ввод элементов массива. MOV SI,0 ;Индекс массива. MOV DX,0000h ;Координаты вывода сообщения STR2. XOR CX,CX MOV CL,N ;Количество повторений тела цикла. @AA: INC DH CALL Cursor ;Установка курсора. MOV BX,SI INC BX ;Номер элемента. CALL Vyvod ;Вывод номера элемента. PUSH DX ;Сохранить координаты курсора. LEA DX,STR2 CALL Write_Str ;Вывод строки. POP DX ;Восстановить координаты курсора. CALL Vvod ;Ввод элемента массива. MOV DI,SI ADD DI,DI MOV WORD PTR A[DI],BX ;Сохранение элемента в массиве. INC SI ;Следующий элемент массива. CMP DH,23 JNE @B ;Очистка экрана для вывода следующих значений. CALL Clear ;Очистка экрана. MOV DX,0000h @B: LOOP @AA ;------------- Вывод введенного массива. CALL Clear ;Очистка экрана. MOV DX,0000h CALL Cursor ;Установка курсора. LEA DX,STR3 CALL Write_Str ;Вывод строки. MOV DX,0100h CALL Cursor ;Установка курсора. MOV CL,N ;Количество повторений тела цикла. MOV SI,0 ;Индекс массива. @AB: MOV BX,WORD PTR A[SI] CALL Vyvod LEA DX,STR4 CALL Write_Str ;Вывод строки. ADD SI,2 ;Следующий элемент массива. LOOP @AB ;------------- Решение задачи. MOV CL,N ;Количество повторений тела цикла. MOV SI,0 ;Индекс массива. @AC: CMP WORD PTR A[SI],0 ;Это отрицательное число? JGE @AD ;Нет - переход к следующему числу. CMP REZ,1 ;Это первое отрицательное число? JNE @AE ;Нет - переход на сравнение. MOV BX,WORD PTR A[SI] ;Берем первое отрицательное MOV REZ,BX ;число в качестве результата. JMP @AD ;Переход к следующему числу. @AE: MOV BX,WORD PTR A[SI] ;Текущее отрицательное число CMP BX,REZ ;меньше результата? JLE @AD ;Да - переход к следующему числу. MOV REZ,BX ;Взять текущее значение в качестве результата. @AD: ADD SI,2 LOOP @AC ;------------- Вывод результата. CMP REZ,1 ;Изменилось значение - JNE @AF ;были отрицательные элементы. LEA DX,STR5 ;Нет отрицательных элементов! CALL Write_Str ;Вывод строки. JMP @AG ;Переход на выход. @AF: LEA DX,STR6 ;Вывод результата. CALL Write_Str ;Вывод строки. MOV BX,REZ CALL Vyvod @AG: MOV AH,1 ;Задержка. INT 21H RET Begin ENDP CodeSg ENDS END Begin