Найти сумму элементов столбца матрицы, содержащего максимальный по модулю элемент - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите с задачей: Матрица чисел из диапазона -99..99 размерностью [1..4; 1..3] вводится с клавиатуры. Найти сумму элементов столбца, содержащего максимальный по модулю элемент. Каким образом осуществляется работа с массивами? Не в том разделе создал http://www.cyberforum.ru/asm-beginners/

Решение задачи: «Найти сумму элементов столбца матрицы, содержащего максимальный по модулю элемент»

textual
Листинг программы
org 100h
jmp  start
 
hello   db  13,10,' CREATE ARRAY'         ; мессаги всякие
        db  13,10,25 dup('~'),13,10,'$'   ;
result  db  13,10,25 dup('~')             ;
        db  13,10,' MAX ELEMENT: $'       ;
summ    db  13,10,' COLUMN SUMM: $'       ;
array   db  12 dup(0)                     ; место под массив (3х4)
max     db  1                             ; переменная для максимального
flag    db  0                             ; флаг отрицательного числа
 
start:
   mov   ah,9                 ; мессага
   mov   dx,hello             ;
   int   21h                  ;
;=============================; ЗАПОЛНЯЕМ МАССИВ ============================
   mov   cx,12                ; всего 12 элементов (счётчик цикла)
   xor   bx,bx                ; BX = 0 (будет счётчиком столбцов)
   mov   di,array             ; адрес начала массива (для STOSB)
cycle:                        ; начало цикла..
   mov   al,' '               ;
   int   29h                  ; вставляем пробел/разделитель
   call  ASC2HEX              ; функция ввода числа с клавиатуры
   cmp   al,[max]             ; число больше переменной?
   jb    minimal              ; нет - пропускаем его
   mov   [max],al             ; иначе: отправляем его в переменную
minimal:                      ;
   cmp   [flag],0             ; проверка флага на отрицательное число
   jz    miss                 ; если он сброшен - число положительное
   neg   al                   ; иначе: NEG его...
miss:                         ;
   stosb                      ; записываем это число в массив
   inc   bx                   ; счётчик столбцов +1
   cmp   bx,3                 ; это 4-ый столбец?
   jnz   next                 ; нет - продолжаем ввод чисел
   xor   bx,bx                ; да  - сбрасываем счётчик столбцов,
   db    13,10,'$'            ; ..и перевод строки
   mov   dx,$-3               ; ^
   mov   ah,9                 ; ^
   int   21h                  ; ^
next:                         ;
   mov   [flag],0             ; сбрасываем флаг для сл.числа
   loop  cycle                ; мотаем цикл СХ-раз..
                              ;
;=============================; ВЫВОДИМ НА ЭКРАН МАКС.ПО-МОДУЛЮ =============
   mov   ah,9                 ; мессага
   mov   dx,result            ;
   int   21h                  ;
   mov   al,[max]             ; берём число в AL
   aam                        ; переводим его в распакованый DEC
   add   ax,3030h             ;     ..и в символьное представление
   xchg  ah,al                ;
   int   29h                  ;
   xchg  ah,al                ;
   int   29h                  ; выводим 2-значное число на экран!
 
;---------------------------------------------------------------------------+
; Здесь нужно вычислить позицию максимального элемента в массиве,           |
; расчитать смещение первого элемента в этом столбце,                       |
; сумировать с учётом знака каждый/третий элемент массива,                  |
; и вывести результат на экран!                                             |
;---------------------------------------------------------------------------+
 
;=============================; ВЫВОДИМ СУММУ НА ЭКРАН ======================
   mov   ah,9                 ; мессага
   mov   dx,summ              ;
   int   21h                  ;
  
;=============================; ВЫХОД =======================================
exit:                         ;
   xor   ax,ax                ;
   int   16h                  ;
   int   20h                  ;
 
;нннннннннннннн ИСПОЛЬЗУЕМЫЕ ФУНКЦИИ нннннннннннннннннннннннннннннннннннннннн
;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
ASC2HEX:                      ; Функция ввода чисел с клавиатуры
                              ; На выходе: AX = число
   push  cx bx si di          ; эти регистры изменятся. сохраняем их
   xor   si,si                ; здесь будет число
   mov   bx,10                ; система счисления для сохранения
   mov   cx,2                 ; число будет 2-значное (макс.-99..99)
typeDigit:                    ;
   xor   ax,ax                ; ждём символ с клавиатуры..
   int   16h                  ;
   cmp   al,'-'               ; это минус?
   jne   positive             ; нет - пропускаем его
   int   29h                  ; да  - выводим минус на экран,
   int   16h                  ;      ..и ждём сл.символ
   inc   [flag]               ; устанавливаем флаг отрицательного
positive:                     ;
   cmp   al,'0'               ; если это не числа 0..9,
   jb    typeDigit            ; ^
   cmp   al,'9'               ; ^
   ja    typeDigit            ; то циклимся.
   int   29h                  ; наш клиент! выводим его на экран
   and   ax,0Fh               ; переводим символ в число,
   xchg  ax,si                ;
   mul   bx                   ;    ...и в 10-тичное.
   add   si,ax                ; кидаем его в SI
   loop  typeDigit            ;
   xchg  ax,si                ; AX = двузначное число по-модулю
   pop   di si bx cx          ; восстанавливаем регистры
RET                           ; возвращаемся туда, от куда прибыли..

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

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