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