Определить столбец, у которого сумма элементов максимальна - Assembler
Формулировка задачи:
Всем снова здравствуйте! Вот собстна текст задачки:
Задать с клавы матрицу 4х4. Определить столбец, у которого сумма элементов максимальна. Заменить элементы этого столбца на "0".
Вот собственно мой набросок
Программа предлагает ввести матрицу (я сделал через dw, привык, но если есть возможность облегчить работу с программой, можно сделать и под db) считает сумму столбца и отображает под ним (в дампе памяти). Не могу понять, как оформить нахождение столбца, сумма которого максимальна (думал сравнить суммы, но код получается большим и много меток. Также думал сравнить как элементы в массиве (есть на форуме задачи "Найти max и min элемент в массиве", можно оттуда взять основу)) Заменить на 0 элементы я в принципе умею, но, опять же, если вы используете гиперумную схему сравнения сумм, то напишите свой вариант :3
Заранее спасибо !
include io.asm
sseg segment stack *
db 255 dup (?)
sseg ends
Dseg segment
matr dw 4 dup (4 dup (?))
a db 1 dup (?)
b db 1 dup (?)
c db 1 dup (?)
d db 1 dup (?)
max db 1 dup (?)
loy db "Введите матрицу:$"
otv db "Получилась матрица:$"
Dseg ends
Cseg segment
assume ds:Dseg,cs:Cseg,ss:Sseg,es:Dseg
start:mov ax,dseg
mov ds,ax
mov ax,0
lea dx,loy
mov ah,9h
int 21h
mov cx,4
mov bx,0
mov si,0
m1:inint matr[bx][si]
add si,2
loop m1
mov bx,8
mov si,0
mov cx,4
m2:inint matr[bx][si]
add si,2
loop m2
mov bx,16
mov si,0
mov cx,4
m3:inint matr[bx][si]
add si,2
loop m3
mov bx,24
mov si,0
mov cx,4
m4:inint matr[bx][si]
add si,2
loop m4
mov si,0
mov bx,0
mov cx,4
mov ax,0
m5:add ax,matr[bx][si]
add bx,8
loop m5
mov a,ax
add SI,2
mov ax,0
mov bx,0
mov cx,4
m6:add ax,matr[bx][si]
add bx,8
loop m6
mov b,ax
add SI,2
mov ax,0
mov bx,0
mov cx,4
m7:add ax,matr[bx][si]
add bx,8
loop m7
mov c,ax
add SI,2
mov ax,0
mov bx,0
mov cx,4
m8:add ax,matr[bx][si]
add bx,8
loop m8
mov d,ax
add SI,2
mov ax,0
mov bx,0
finish
cseg ends
end startРешение задачи: «Определить столбец, у которого сумма элементов максимальна»
textual
Листинг программы
LOCALS .model small .stack 100h .data matr dw 10, 12, 14, 16 dw 58, 67, 11, 31 dw 99, 97, 34, 55 dw 15, 88, 77, 33 Max dw -32768 .code main proc mov ax, @data mov ds, ax ;вычисление смещения в массиве при вычислении адреса ;следующего элемента в столбце mov bx, 4 ;bx:=количество столбцов shl bx, 1 ;bx:=bx*размер одного элемента в байтах mov cx, 4 ;cx:=количество столбцов lea si, matr @@ForJ: ;цикл по столбцам push cx mov cx, 4 ;cx:=количество строк mov di, si ;di:=адресу первого элемента очередного столбца mov ax, 0 ;значение суммы элементов столбца @@ForI: ;цикл по строкам add ax, word ptr[di] ;суммирование add di, bx ;переход к следующему элементу столбца loop @@ForI pop cx cmp ax, [Max] jle @@Next mov [Max], ax @@Next: add si, 2 ;переход к следующему столбцу loop @@ForJ ;вывод результата mov ax, [Max] call Show_AX ;завершение программы mov ax, 4C00h int 21h main endp ; выводит число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push di mov cx, 10 xor di, di ; di - кол. цифр в числе ; если число в ax отрицательное, то ;1) напечатать '-' ;2) сделать ax положительным or ax, ax jns @@Conv push ax mov dx, '-' mov ah, 2 ; ah - функция вывода символа на экран int 21h pop ax neg ax @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стэк or ax, ax jnz @@Conv ; выводим из стэка на экран @@Show: pop dx ; dl = очередной символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop dx pop cx pop bx pop ax ret Show_AX endp end main
Объяснение кода листинга программы
- Переменная
matrсодержит матрицу 4х4, значения элементов которой равны 10, 12, 14, 16; 58, 67, 11, 31; 99, 97, 34, 55; 15, 88, 77, 33. - Переменная
Maxинициализирована значением -32768. - Код выполняет вычисление суммы элементов каждого столбца матрицы и сохраняет максимальное значение в переменной
Max. - Значение переменной
Maxвыводится на экран с помощью процедурыShow_AX. - После вывода значения переменной
Maxпрограмма завершается. - В процедуре
Show_AXвыполняется перевод числа из регистра AX в строку, содержащую символы от '0' до '9', и выводится на экран. - Для вывода числа в формате строкки используется ассемблерная инструкция
int 21h, которая выполняет функцию вывода символа на экран. - В цикле выводятся все цифры числа, кроме последней, поскольку в данной реализации числа представляются без знака.
- Для корректного вывода отрицательных чисел перед выводом числа выполняется проверка на его знак с помощью инструкции
jns. Если число отрицательное, то выводится знак '-', а число делается положительным с помощью инструкцииneg. - Для выполнения операций над числами (сложение, вычитание, умножение, деление) в данной реализации используются ассемблерные инструкции
add,sub,mul,div.