Получить матрицу, элемент 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 ;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д