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