Определить столбец, у которого сумма элементов максимальна - Assembler

Узнай цену своей работы

Формулировка задачи:

Всем снова здравствуйте! Вот собстна текст задачки: Задать с клавы матрицу 4х4. Определить столбец, у которого сумма элементов максимальна. Заменить элементы этого столбца на "0". Вот собственно мой набросок
 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
Программа предлагает ввести матрицу (я сделал через dw, привык, но если есть возможность облегчить работу с программой, можно сделать и под db) считает сумму столбца и отображает под ним (в дампе памяти). Не могу понять, как оформить нахождение столбца, сумма которого максимальна (думал сравнить суммы, но код получается большим и много меток. Также думал сравнить как элементы в массиве (есть на форуме задачи "Найти max и min элемент в массиве", можно оттуда взять основу)) Заменить на 0 элементы я в принципе умею, но, опять же, если вы используете гиперумную схему сравнения сумм, то напишите свой вариант :3 Заранее спасибо !

Решение задачи: «Определить столбец, у которого сумма элементов максимальна»

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

Объяснение кода листинга программы

  1. Переменная matr содержит матрицу 4х4, значения элементов которой равны 10, 12, 14, 16; 58, 67, 11, 31; 99, 97, 34, 55; 15, 88, 77, 33.
  2. Переменная Max инициализирована значением -32768.
  3. Код выполняет вычисление суммы элементов каждого столбца матрицы и сохраняет максимальное значение в переменной Max.
  4. Значение переменной Max выводится на экран с помощью процедуры Show_AX.
  5. После вывода значения переменной Max программа завершается.
  6. В процедуре Show_AX выполняется перевод числа из регистра AX в строку, содержащую символы от '0' до '9', и выводится на экран.
  7. Для вывода числа в формате строкки используется ассемблерная инструкция int 21h, которая выполняет функцию вывода символа на экран.
  8. В цикле выводятся все цифры числа, кроме последней, поскольку в данной реализации числа представляются без знака.
  9. Для корректного вывода отрицательных чисел перед выводом числа выполняется проверка на его знак с помощью инструкции jns. Если число отрицательное, то выводится знак '-', а число делается положительным с помощью инструкции neg.
  10. Для выполнения операций над числами (сложение, вычитание, умножение, деление) в данной реализации используются ассемблерные инструкции add, sub, mul, div.

Оцени полезность:

7   голосов , оценка 3.429 из 5
Похожие ответы