N equ 4 ;размерность матрицы
cseg segment para public 'code'
assume cs:cseg, ds:dseg, es:dseg
start: ;точка входа
mov ax, dseg ;настроим сегментные регистры
mov ds, ax
mov es, ax
call GetMin ;ищем минимум в нужных диагоналях
lea dx, sMin ;сообщение
mov ah, 9
int 21h
mov ax, min ;минимум
call PrDec ;выведем знаковое десятичное число
lea dx, sPress ;Pres any key
mov ah, 9
int 21h
mov ah, 0 ;ждем нажатие на клавишу
int 16h
mov ax, 4c00h ;выход в ДОС
int 21h
;ищем минимум в указанной диагонали
;параметры:
; BX - адрес (база) массива
; SI - индекс первого элемента диагонали
; DX - приращение для индекса следующего элемента диагонали
; CX - число элементов диагонали
Diagonal proc
mov ax, [bx+si] ;очередной элемент диагонали
cmp ax, min ;сравниваем (сравнение знаковое) с минимумом
jge D_next ;если >=, то на следующий
mov min, ax ;сохраним очередной минимальный
D_next:
add si, dx ;индекс следующего элемента
loop Diagonal ;по всем элементам диагонали
ret
Diagonal endp
;ищем минимум по трем диагоналям
GetMin proc
mov min, 7fffh ;заведомо самое большое число
lea bx, array ;адрес массива
mov dx, 2*(N-1) ;приращение для следующего элемента (*2, потому что слова)
;диагональ выше побочной
mov si, 2*(N-2) ;индекс первого элемента
mov cx, N-1 ;число элементов
call Diagonal
;побочная диагональ
mov si, 2*(N-1) ;индекс первого элемента
mov cx, N ;число элементов
call Diagonal
;диагональ ниже побочной
mov si, 2*(2*N-1) ;индекс первого элемента
mov cx, N-1 ;число элементов
call Diagonal
ret
GetMin endp
;вывод десятичного числа из ax
PrDec proc
test ax, ax ;проверим на знак
jns pd_unsigned ;если неотрицательное, то на вывод
push ax
mov al, '-' ;выведем '-'
int 29h
pop ax
neg ax ;получим модуль числа
pd_unsigned:
mov bx, 10 ;будем делить на 10, чтобы получить остатки
xor cx, cx ;счетчик цифр
pd_dig: ;цикл формирования цифр,
xor dx, dx ; как остатков от деления на 10
div bx
push dx ;очередной остаток = десятичному разряду
inc cx ;считаем
or ax, ax ;есть ли еще?
jnz pd_dig
pd_pr: ;цикл вывода цифр
pop ax ;извлекаем из стека в обратном порядке
add al, '0' ;в символ
int 29h
LOOP pd_pr ;по всем
ret
PrDec endp
cseg ends
dseg segment para public 'data'
sMin db 'Minimum = $'
sPress db 0dh,0ah,'Press any key for exit$'
min dw 0
array dw 1,6,0,4
dw 2,5,7,1
dw 8,9,0,4
dw 1,2,3,5
dseg ends
end start ;конец программы
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.