Получить матрицу, элемент bij которой равен произведению элемента aij исходной матрицы на максимум i строки - Assembler
Формулировка задачи:
Здравствуйте
Помогите пожалуйста с задачей
Необходимо получить новую матрицу В, элемент bij которой равен произведению элемента aij исходной матрицы на максимум i строки.
То есть если имеется матрица:
2 3 4 0
1 0 5 2
3 9 11 4
То новая матрица будет выглядеть так:
8 12 16 0 //умножаем на максимум, то есть на 4
5 0 25 10 //умножаем на максимум, то есть на 5
33 99 121 44 //умножаем на максимум, то есть на 11
На С# эта задача не представляет никаких проблем. Но вот как можно сделать ее на ассемблере?
Решение задачи: «Получить матрицу, элемент bij которой равен произведению элемента aij исходной матрицы на максимум i строки»
textual
Листинг программы
- org 100h
- jmp start
- mess0 db 13,10,' Current array:'
- db 13,10,'----------------',13,10,'$'
- mess1 db 13,10,10,' New array:'
- db 13,10,'----------------',13,10,'$'
- crlf db 13,10,'$' ; для построения матрицы
- mult db 0,0,0,0,0 ; максимальное каждой строки (множители)
- array db 7,6,3,2,1 ; массив
- db 0,4,5,6,8 ;
- db 5,1,2,3,5 ;
- db 6,9,5,4,2 ;
- db 1,3,6,9,8 ;
- start: ;
- mov dx,mess0 ;
- call Message ;
- call printArray ; выводим его на экран
- call FindMax ; ищем мах.каждой строке
- call createNewArray ; создаём новый массив
- mov dx,mess1 ;
- call Message ;
- call printArray ; выводим его на экран
- exit: xor ax,ax ;
- int 16h ;
- int 20h ; выход!
- ;ннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
- Message: ;
- mov ah,9 ;
- int 21h ;
- ret
- ;----------------------<--- Выводим массив на экран --------------
- printArray: ;
- mov bx,5 ; колонок в строке
- mov cx,25 ; длина массива
- mov si,array ; его адрес
- kLoop: xor ax,ax ;
- lodsb ; читаем байт из SI
- aam ;
- or ax,3030h ;
- xchg ah,al ;
- int 29h ;
- xchg ah,al ;
- int 29h ; выводим его в DEC
- mov al,',' ; вставляем разделитель
- int 29h ;
- dec bx ;
- jnz next2 ; выводим одну строку
- mov dx,crlf ; перевод строки
- call Message ;
- mov bx,5 ; восстановим счётчик колонок
- next2: loop kLoop ;
- ret
- ;----------------------<--- Ищем максимальное в каждой строке -----
- FindMax: ;
- xor ax,ax ;
- mov bx,5 ; всего строк
- mov cx,bx ; всего колонок
- mov si,array ;
- mov di,mult ; адрес для сохранения множителей
- mLoop: lodsb ;
- cmp ah,al ;
- ja next3 ;
- xchg ah,al ; в AH будет максимальное
- next3: loop mLoop ;
- shr ax,8 ; проверили очередную строку!
- stosb ; сохраняем её макс.байт
- mov cx,5 ; сбрасываем колонки
- dec bx ; все строки проверили?
- jnz mLoop ;
- ret
- ;----------------------<--- Создаём новый массив -------------------
- createNewArray: ;
- xor ax,ax ;
- mov bx,mult ; адрес таблицы множителей
- mov cx,5 ; колонок,
- mov dx,cx ; ..и столько-же строк
- mov si,array ;
- mov di,si ;
- nLoop: lodsb ; умножаем строку на первый множитель
- mul byte[bx] ;
- stosb ;
- loop nLoop ;
- mov cx,5 ; сброс колонок
- inc bx ; сл.множитель
- dec dx ; все строки обработали?
- jnz nLoop ;
- ret ;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д