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