Консультация № 178137
01.05.2010, 09:46
0.00 руб.
0 1 1
Доброго времени Суток дорогие эксперты:

Требуется с помошью TASM организовать решение задачи

Дана квадратная матрица Найти минимальное из значений элементов побочной диагонали матрицы и соседних с ними справа и слева.

Хар-ки:
1)процессор intel core 2 solo CPU U3500
2)window vista home premium 32х разрядная
3)Turbo Assembler Version 4.1 в папке asm находится фаил TASM поэтому думаю он предпочтителен
4)вычисления производить в сопроцессоре

Элементы матрицы целые числа

пример:

1 6 0 4
2 5 7 1
8 9 0 4
1 2 3 5

Использовать побольше коментариев ипроцедур очень желательно! Спасибо за внимание!

Обсуждение

давно
Посетитель
7438
7205
06.05.2010, 12:19
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич.
Вот Вам программа:
Код:
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 ;конец программы
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа