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