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

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

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

Всем снова здравствуйте! Вот собстна текст задачки: Задать с клавы матрицу 4х4. Определить столбец, у которого сумма элементов максимальна. Заменить элементы этого столбца на "0". Вот собственно мой набросок
Листинг программы
  1. include io.asm
  2. sseg segment stack *
  3. db 255 dup (?)
  4. sseg ends
  5. Dseg segment
  6. matr dw 4 dup (4 dup (?))
  7. a db 1 dup (?)
  8. b db 1 dup (?)
  9. c db 1 dup (?)
  10. d db 1 dup (?)
  11. max db 1 dup (?)
  12. loy db "Введите матрицу:$"
  13. otv db "Получилась матрица:$"
  14. Dseg ends
  15. Cseg segment
  16. assume ds:Dseg,cs:Cseg,ss:Sseg,es:Dseg
  17. start:mov ax,dseg
  18. mov ds,ax
  19. mov ax,0
  20. lea dx,loy
  21. mov ah,9h
  22. int 21h
  23. mov cx,4
  24. mov bx,0
  25. mov si,0
  26. m1:inint matr[bx][si]
  27. add si,2
  28. loop m1
  29. mov bx,8
  30. mov si,0
  31. mov cx,4
  32. m2:inint matr[bx][si]
  33. add si,2
  34. loop m2
  35. mov bx,16
  36. mov si,0
  37. mov cx,4
  38. m3:inint matr[bx][si]
  39. add si,2
  40. loop m3
  41. mov bx,24
  42. mov si,0
  43. mov cx,4
  44. m4:inint matr[bx][si]
  45. add si,2
  46. loop m4
  47. mov si,0
  48. mov bx,0
  49. mov cx,4
  50. mov ax,0
  51. m5:add ax,matr[bx][si]
  52. add bx,8
  53. loop m5
  54. mov a,ax
  55. add SI,2
  56. mov ax,0
  57. mov bx,0
  58. mov cx,4
  59. m6:add ax,matr[bx][si]
  60. add bx,8
  61. loop m6
  62. mov b,ax
  63. add SI,2
  64. mov ax,0
  65. mov bx,0
  66. mov cx,4
  67. m7:add ax,matr[bx][si]
  68. add bx,8
  69. loop m7
  70. mov c,ax
  71. add SI,2
  72. mov ax,0
  73. mov bx,0
  74. mov cx,4
  75. m8:add ax,matr[bx][si]
  76. add bx,8
  77. loop m8
  78. mov d,ax
  79. add SI,2
  80. mov ax,0
  81. mov bx,0
  82. finish
  83. cseg ends
  84. end start
Программа предлагает ввести матрицу (я сделал через dw, привык, но если есть возможность облегчить работу с программой, можно сделать и под db) считает сумму столбца и отображает под ним (в дампе памяти). Не могу понять, как оформить нахождение столбца, сумма которого максимальна (думал сравнить суммы, но код получается большим и много меток. Также думал сравнить как элементы в массиве (есть на форуме задачи "Найти max и min элемент в массиве", можно оттуда взять основу)) Заменить на 0 элементы я в принципе умею, но, опять же, если вы используете гиперумную схему сравнения сумм, то напишите свой вариант :3 Заранее спасибо !

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

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.  
  9. matr    dw      10, 12, 14, 16
  10.         dw      58, 67, 11, 31
  11.         dw      99, 97, 34, 55
  12.         dw      15, 88, 77, 33
  13. Max     dw      -32768
  14. .code
  15.  
  16. main    proc
  17.         mov     ax,     @data
  18.         mov     ds,     ax
  19.  
  20.         ;вычисление смещения в массиве при вычислении адреса
  21.         ;следующего элемента в столбце
  22.         mov     bx,     4       ;bx:=количество столбцов
  23.         shl     bx,     1       ;bx:=bx*размер одного элемента в байтах
  24.  
  25.         mov     cx,     4       ;cx:=количество столбцов
  26.         lea     si,     matr
  27.         @@ForJ:                 ;цикл по столбцам
  28.                 push    cx
  29.                 mov     cx,     4       ;cx:=количество строк
  30.                 mov     di,     si      ;di:=адресу первого элемента очередного столбца
  31.                 mov     ax,     0       ;значение суммы элементов столбца
  32.                 @@ForI:         ;цикл по строкам
  33.                         add     ax,     word ptr[di]    ;суммирование
  34.                         add     di,     bx      ;переход к следующему элементу столбца
  35.                 loop    @@ForI
  36.                 pop     cx
  37.  
  38.                 cmp     ax,     [Max]
  39.                 jle     @@Next
  40.                 mov     [Max],  ax
  41.         @@Next:
  42.                 add     si,     2       ;переход к следующему столбцу
  43.         loop    @@ForJ
  44.         ;вывод результата
  45.         mov     ax,     [Max]
  46.         call    Show_AX
  47.         ;завершение программы
  48.         mov     ax,     4C00h
  49.         int     21h
  50. main    endp
  51.  
  52. ; выводит число из регистра AX на экран
  53. ; входные данные:
  54. ; ax - число для отображения
  55. Show_AX proc
  56.         push    ax
  57.         push    bx
  58.         push    cx
  59.         push    dx
  60.         push    di
  61.  
  62.         mov     cx, 10
  63.         xor     di, di          ; di - кол. цифр в числе
  64.  
  65.         ; если число в ax отрицательное, то
  66.         ;1) напечатать '-'
  67.         ;2) сделать ax положительным
  68.         or      ax, ax
  69.         jns     @@Conv
  70.         push    ax
  71.         mov     dx, '-'
  72.         mov     ah, 2           ; ah - функция вывода символа на экран
  73.         int     21h
  74.         pop     ax
  75.  
  76.         neg     ax
  77.  
  78. @@Conv:
  79.         xor     dx, dx
  80.         div     cx              ; dl = num mod 10
  81.         add     dl, '0'         ; перевод в символьный формат
  82.         inc     di
  83.         push    dx              ; складываем в стэк
  84.         or      ax, ax
  85.         jnz     @@Conv
  86.         ; выводим из стэка на экран
  87. @@Show:
  88.         pop     dx              ; dl = очередной символ
  89.         mov     ah, 2           ; ah - функция вывода символа на экран
  90.         int     21h
  91.         dec     di              ; повторяем пока di<>0
  92.         jnz     @@Show
  93.  
  94.         pop     di
  95.         pop     dx
  96.         pop     cx
  97.         pop     bx
  98.         pop     ax
  99.         ret
  100. Show_AX endp
  101.  
  102. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы