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