Найти в матрице строку с минимальным значением суммы элементов [tasm] - Assembler

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

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

Нужно решить задачу Задать с клавиатуры матрицу размером 4х4. Найти строку с минимальным значением суммы элементов и заменить все элементы найденной строки на 0. Предусмотреть: 1)Приглашение к вводу матрицы 2)Проверку разрядности элементов матрицы, разрядность не меньше 2 3)Вывод сформированной матрицы

Решение задачи: «Найти в матрице строку с минимальным значением суммы элементов [tasm]»

textual
Листинг программы
  1. model small
  2. .486
  3. LOCALS @@
  4. .stack  256
  5. .data
  6.  
  7. Rows            equ    4                ;максимальное количество строк
  8. Columns         equ    4                ;максимальное количество столбцов
  9. iSize           equ    Rows*Columns     ;максимальный размер матрицы
  10.  
  11. m               dw     Rows             ;текущее количество строк
  12. n               dw     Columns          ;текущее количество столбцов
  13.  
  14. Matrix          dw     iSize dup(?)     ;матрица
  15.  
  16. asCR_LF         db      0dh, 0ah, '$'   ;"перевод строки"
  17. asTitle0        db      'Input matrix', '$'
  18. asTitle1        db      'Current matrix', '$'
  19. asTitle2        db      'Result matrix', '$'
  20. asPrompt1       db      'a[ ', '$'      ;строка приглашения
  21. asPrompt2       db      ',  ', '$'
  22. asPrompt3       db      ']= ', '$'
  23.  
  24. kbMaxLen        equ     6+1             ;буфер ввода с клавиатуры Fn 0ah
  25. kbInput         db      kbMaxLen, 0, kbMaxLen dup(0)
  26.  
  27. .code
  28.  
  29. ; преобразования строки в число
  30. ; на входе:
  31. ; ds:[si] - строка с числом
  32. ; ds:[di] - адрес числа
  33. ; на выходе
  34. ; ds:[di] - число
  35. ; CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
  36. Str2Num PROC
  37.         push    ax
  38.         push    bx
  39.         push    cx
  40.         push    dx
  41.         push    ds
  42.         push    es
  43.         push    si
  44.  
  45.         push    ds
  46.         pop     es
  47.  
  48.         mov     cl, ds:[si]
  49.         xor     ch, ch
  50.  
  51.         inc     si
  52.  
  53.         mov     bx, 10
  54.         xor     ax, ax
  55.  
  56.         ;если в строке первый символ '-'
  57.         ; - перейти к следующему
  58.         ; - уменьшить количество рассматриваемых символов
  59.         cmp     byte ptr [si], '-'
  60.         jne     @@Loop
  61.         inc     si
  62.         dec     cx
  63. @@Loop:
  64.         mul     bx         ; умножаем ax на 10 ( dx:ax=ax*bx )
  65.         mov     [di], ax   ; игнорируем старшее слово
  66.         cmp     dx, 0      ; проверяем, результат на переполнение
  67.         jnz     @@Error
  68.  
  69.         mov     al, [si]   ; Преобразуем следующий символ в число
  70.         cmp     al, '0'
  71.         jb      @@Error
  72.         cmp     al, '9'
  73.         ja      @@Error
  74.         sub     al, '0'
  75.         xor     ah, ah
  76.         add     ax, [di]
  77.         jc      @@Error    ; Если сумма больше 65535
  78.         cmp     ax, 8000h
  79.         ja      @@Error
  80.         inc     si
  81.  
  82.         loop    @@Loop
  83.  
  84.         pop     si         ;проверка на знак
  85.         push    si
  86.         inc     si
  87.         cmp     byte ptr [si], '-'
  88.         jne     @@Check    ;если должно быть положительным
  89.         neg     ax         ;если должно быть отрицательным
  90.         jmp     @@StoreRes
  91. @@Check:                   ;дополнительная проверка, когда при вводе положительного числа получили отрицательное
  92.        or       ax, ax     ;
  93.        js       @@Error
  94. @@StoreRes:                ;сохранить результат
  95.         mov     [di], ax
  96.         clc
  97.         pop     si
  98.         pop     es
  99.         pop     ds
  100.         pop     dx
  101.         pop     cx
  102.         pop     bx
  103.         pop     ax
  104.         ret
  105. @@Error:
  106.         xor     ax, ax
  107.         mov     [di], ax
  108.         stc
  109.         pop     si
  110.         pop     es
  111.         pop     ds
  112.         pop     dx
  113.         pop     cx
  114.         pop     bx
  115.         pop     ax
  116.         ret
  117. Str2Num ENDP
  118.  
  119. ; выводит число из регистра AX на экран
  120. ; входные данные:
  121. ; ax - число для отображения
  122. Show_AX proc
  123.         push    ax
  124.         push    bx
  125.         push    cx
  126.         push    dx
  127.         push    di
  128.  
  129.         mov     cx, 10
  130.         xor     di, di          ; di - кол. цифр в числе
  131.  
  132.         ; если число в ax отрицательное, то
  133.         ;1) напечатать '-'
  134.         ;2) сделать ax положительным
  135.         or      ax, ax
  136.         jns     @@Conv
  137.         push    ax
  138.         mov     dx, '-'
  139.         mov     ah, 2           ; ah - функция вывода символа на экран
  140.         int     21h
  141.         pop     ax
  142.  
  143.         neg     ax
  144.  
  145. @@Conv:
  146.         xor     dx, dx
  147.         div     cx              ; dl = num mod 10
  148.         add     dl, '0'         ; перевод в символьный формат
  149.         inc     di
  150.         push    dx              ; складываем в стэк
  151.         or      ax, ax
  152.         jnz     @@Conv
  153.         ; выводим из стэка на экран
  154. @@Show:
  155.         pop     dx              ; dl = очередной символ
  156.         mov     ah, 2           ; ah - функция вывода символа на экран
  157.         int     21h
  158.         dec     di              ; повторяем пока di<>0
  159.         jnz     @@Show
  160.  
  161.         pop     di
  162.         pop     dx
  163.         pop     cx
  164.         pop     bx
  165.         pop     ax
  166.         ret
  167. Show_AX endp
  168.  
  169. ; На входе
  170. ;m     - количество строк
  171. ;n     - количество столбцов
  172. ;ds:dx - адрес матрицы
  173. ShowMatrix PROC FAR
  174.         pusha
  175.         mov     si, 0  ; строка
  176.         mov     di, 0  ; столбец
  177.         mov     bx, dx
  178.  
  179. @@ShowRow:
  180.         mov     ax, [bx]
  181.         call    Show_AX
  182.  
  183.         mov     ah,     02h
  184.         mov     dl,     ' '
  185.         int     21h
  186.  
  187.         add     bx,     2
  188.  
  189.         inc     di
  190.  
  191.         cmp     di, n
  192.         jb      @@ShowRow
  193.  
  194.         mov     dx, OFFSET asCR_LF
  195.         mov     ah, 09h
  196.         int     21h
  197.  
  198.         mov     di, 0
  199.  
  200.         inc     si
  201.  
  202.         cmp     si, m
  203.         jb      @@ShowRow
  204.  
  205.         popa
  206.         ret
  207. ShowMatrix ENDP
  208.  
  209. ; На входе
  210. ;ds:dx - адрес матрицы
  211. InputMatrix PROC
  212.         pusha
  213.         ;bx - адрес очередного элемента матрицы
  214.         mov     bx,     dx
  215.         ;Вывод на экран приглашения ввести матрицу
  216.         mov     ah, 09h
  217.         mov     dx, OFFSET asTitle0
  218.         int     21h
  219.  
  220.         mov     ah, 09h
  221.         mov     dx, OFFSET asCR_LF
  222.         int     21h
  223.  
  224.         mov     si, 1  ; строка (индекс)
  225.         mov     di, 1  ; столбец (индекс)
  226. @@InpInt:
  227.         ;вывод на экран приглашения 'a[  1,  1]='
  228.         lea     dx, asPrompt1
  229.         mov     ah, 09h
  230.         int     21h
  231.         mov     ax,     si
  232.         call    Show_AX
  233.         lea     dx, asPrompt2
  234.         mov     ah, 09h
  235.         int     21h
  236.         mov     ax,     di
  237.         call    Show_AX
  238.         lea     dx, asPrompt3
  239.         mov     ah, 09h
  240.         int     21h
  241.  
  242.         ;Ввод строки
  243.         mov     ah, 0ah
  244.         mov     dx, OFFSET kbInput
  245.         int     21h
  246.  
  247.         ;Преобразование строки в число
  248.         push    di
  249.         push    si
  250.         mov     si, OFFSET kbInput+1
  251.         mov     di, bx
  252.         call    Str2Num
  253.         pop     si
  254.         pop     di
  255.         jc      @@InpInt  ; если ошибка преобразования - повторить ввод
  256.         ;проверка введенного числа на количество разрядов не менее 2
  257.         cmp     word ptr [bx],  10
  258.         jge     @@Ok
  259.         cmp     word ptr [bx],  -10
  260.         jle     @@Ok
  261.         jmp     @@InpInt
  262. @@Ok:
  263.         ;на экране - перейти к следующей строке
  264.         mov     dx, OFFSET asCR_LF
  265.         mov     ah, 09h
  266.         int     21h
  267.         ;перейти к следующему элементу матрицы
  268.         add     bx,     2
  269.  
  270.         inc     di
  271.  
  272.         cmp     di, n
  273.         jbe     @@InpInt
  274.  
  275.         mov     di, 1
  276.  
  277.         inc     si
  278.  
  279.         cmp     si, m
  280.         jbe     @@InpInt
  281.  
  282.         popa
  283.         ret
  284. InputMatrix ENDP
  285.  
  286. Main    PROC    FAR
  287.         mov     dx, @data
  288.         mov     ds, dx
  289.  
  290.         mov     dx, OFFSET Matrix
  291.         call    InputMatrix
  292.  
  293.         mov     ah, 09h
  294.         mov     dx, OFFSET asTitle1
  295.         int     21h
  296.  
  297.         mov     ah, 09h
  298.         mov     dx, OFFSET asCR_LF
  299.         int     21h
  300.  
  301.         mov     dx, OFFSET Matrix
  302.         call    ShowMatrix
  303.  
  304.         ;поиск строки с минимальным значением суммы элементов
  305.         mov     ax,     7FFFh   ;минимальное значение суммы в матрице
  306.         mov     di,     0       ;номер строки с минимальной суммой
  307.         mov     cx,     m
  308.         lea     si,     Matrix
  309. @@ForI:                         ;цикл по строкам
  310.         mov     bx,     0       ;сумма элементов строки
  311.         push    cx
  312.         mov     cx,     n       ;количество элементов в строке
  313.         @@ForJ:
  314.                 add     bx,     [si]
  315.                 add     si,     2
  316.                 loop    @@ForJ
  317.         pop     cx
  318.  
  319.         cmp     ax,     bx
  320.         jle     @@Next
  321.         mov     ax,     bx
  322.         mov     di,     m       ;di - номер строки с минимальной суммой
  323.         sub     di,     cx
  324. @@Next:
  325.         loop    @@ForI
  326.  
  327.         ;замена элементов строки с минимальной суммой элементов, на нули
  328.         lea     bx,     Matrix
  329.         mov     ax,     n
  330.         mul     di
  331.         shl     ax,     1
  332.         add     bx,     ax
  333.         mov     cx,     n
  334.         mov     ax,     0
  335. @@@ForJ:
  336.         mov     [bx],   ax
  337.         add     bx,     2
  338.         loop    @@@ForJ
  339.  
  340.  
  341.         ;Вывод результатов на экран
  342.         mov     ah, 09h
  343.         mov     dx, OFFSET asTitle2
  344.         int     21h
  345.  
  346.         mov     ah, 09h
  347.         mov     dx, OFFSET asCR_LF
  348.         int     21h
  349.  
  350.         mov     dx, OFFSET Matrix
  351.         call    ShowMatrix
  352.  
  353.         mov     ax, 4c00h
  354.         int     21h
  355. Main    ENDP
  356.  
  357. END     Main

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

The code is written in assembly language and is tasked with finding the row in the matrix with the minimum sum of elements. The algorithm is as follows:

  1. The program prompts the user to enter the matrix.
  2. It then proceeds to input the matrix row by row.
  3. After entering the matrix, it checks if the number entered is valid (not negative and has at least two digits).
  4. It then proceeds to sum the elements in each row and compares it with the current minimum sum.
  5. If a new minimum is found, it records the row number.
  6. After going through all the rows, it prints out the row with the minimum sum.
  7. Finally, it asks the user to press any key to exit. The code uses the DOS function set 21h to output text to the screen. It also uses the BX register to point to the current element being processed in the matrix. The SI register is used to keep track of the row being processed.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

9   голосов , оценка 4.556 из 5

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

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

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