Получить матрицу, элемент 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                              ;

Оцени полезность:

13   голосов , оценка 4.231 из 5
Похожие ответы