Сложение двух матриц - Assembler

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

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

Кто сможет написать код программы на TASM , в которой две матрицы(заданные в коде) будут складываться,а результат будет выводится на экран?

Решение задачи: «Сложение двух матриц»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         CrLf    db      0Dh, 0Ah, '$'
  9.         M       equ     4
  10.         N       equ     7
  11.  
  12.         A       dw      -100, 123, 777, -561, 891, -222, -99
  13.                 dw       147, 564, -85, -753, 243,  478, 557
  14.                 dw        72,  64,  11,   88, -49,   69,  57
  15.                 dw       951, -22, -33, -210,  79,  111, 232
  16.         B       dw         1,   2,   3,    5,   4,    7,   9
  17.                 dw        -4,  -8, 100, -645, 555, -222,  88
  18.                 dw        36,  36, -36,  366, 362,  542,  36
  19.                 dw       -77, 444, 333, -111, -54,  444, 361
  20.         C       dw      M*N dup(?)
  21.  
  22.         String  db      256 dup(?)
  23.         Pads    db      10 dup(' ')     ;пробелы для выравнивния выводимых чисел
  24.         RPad    equ     7               ;выравнивание чисел вправо на 7 позиций
  25. .code
  26.  
  27. main    proc
  28.         mov     ax,     @data
  29.         mov     ds,     ax
  30.  
  31.         lea     si,     A
  32.         lea     di,     B
  33.         lea     bx,     C
  34.         mov     cx,     M*N
  35. ForIJ:
  36.         mov     ax,     [si]
  37.         add     ax,     [di]
  38.         mov     [bx],   ax
  39.         add     si,     2
  40.         add     di,     2
  41.         add     bx,     2
  42.         loop    ForIJ
  43.  
  44.         lea     dx,     C
  45.         call    ShowMatrix
  46.  
  47.         mov     ax,     4C00h
  48.         int     21h
  49. main    endp
  50.  
  51. ; преобразует число из регистра AX в строку
  52. ; входные данные:
  53. ; ax - число для отображения
  54. ; ds:dx - адрес для результирующей строки Pascal типа
  55. Int16ToStr      proc
  56.         push    ax
  57.         push    bx
  58.         push    cx
  59.         push    dx
  60.         push    di
  61.         push    si
  62.  
  63.         mov     si,     dx
  64.         mov     [si],   byte ptr 0      ;текущая длина строки равна 0
  65.  
  66.         mov     cx, 10
  67.         xor     di, di          ; di - кол. цифр в числе
  68.  
  69.         ; если число в ax отрицательное, то
  70.         ;1) увеличить длину строки на 1
  71.         ;2) первый символ в строке '-'
  72.         ;3) сделать ax положительным
  73.         or      ax, ax
  74.         jns     @@Conv
  75.         inc     byte ptr [si]
  76.         mov     [si+1], byte ptr '-'
  77.  
  78.         neg     ax
  79.  
  80. @@Conv:
  81.         xor     dx, dx
  82.         div     cx              ; dl = num mod 10
  83.         add     dl, '0'         ; перевод в символьный формат
  84.         inc     di
  85.         push    dx              ; складываем в стек
  86.         or      ax, ax
  87.         jnz     @@Conv
  88.         ; выводим из стека в строку
  89.         mov     ax,     0
  90.         mov     al,     [si]     ячейку с длиной записываем длину строки
  91.         add     [si],   di       учётом возможного символа знака
  92.         inc     si              ;устанавливаем указатель на первую свободную ячейку
  93.         add     si,     ax
  94. @@Show:
  95.         pop     dx              ; dl = очередной символ
  96.         mov     [si],   dl
  97.         inc     si
  98.         dec     di              ; повторяем пока di<>0
  99.         jnz     @@Show
  100.  
  101.         pop     si
  102.         pop     di
  103.         pop     dx
  104.         pop     cx
  105.         pop     bx
  106.         pop     ax
  107.         ret
  108. Int16ToStr      endp
  109.  
  110. ; На входе
  111. ;m     - количество строк
  112. ;n     - количество столбцов
  113. ;ds:dx - адрес матрицы слов
  114. ShowMatrix PROC
  115.         push    ax
  116.         push    bx
  117.         push    cx
  118.         push    dx
  119.         push    si
  120.         push    di
  121.  
  122.         mov     si, 0  ; строка
  123.         mov     di, 0  ; столбец
  124.         mov     cx, dx
  125.  
  126. @@ShowRow:
  127.         mov     dx, 0
  128.         mov     ax, n*2
  129.         mul     si
  130.         mov     bx, ax
  131.         add     bx, cx
  132.  
  133.         mov     ax, [bx+di]
  134.  
  135.         push    si
  136.         push    cx
  137.         ;преобразование числа в строку
  138.         lea     dx, String
  139.         call    Int16ToStr
  140.         ;вывод выравнивающих пробелов
  141.         mov     cl, RPad
  142.         sub     cl, [String]
  143.         mov     ch, 0
  144.         lea     si, Pads
  145.         call    ShowSubStr
  146.         ;вывод строки с числом
  147.         lea     si, String+1
  148.         mov     cl, String
  149.         mov     ch, 0
  150.         call    ShowSubStr
  151.         pop     cx
  152.         pop     si
  153.  
  154.         add     di, 2
  155.  
  156.         cmp     di, n*2
  157.         jb      @@ShowRow
  158.  
  159.         lea     dx, CrLf
  160.         mov     ah, 09h
  161.         int     21h
  162.  
  163.         mov     di, 0
  164.  
  165.         inc     si
  166.  
  167.         cmp     si, m
  168.         jb      @@ShowRow
  169.  
  170.         pop     di
  171.         pop     si
  172.         pop     dx
  173.         pop     cx
  174.         pop     bx
  175.         pop     ax
  176.         ret
  177. ShowMatrix ENDP
  178.  
  179. ;процедура вывода подстроки
  180. ;на входе:
  181. ;  ds:si - адрес первого символа подстроки
  182. ;  cx    - длина выводимой подсторки
  183. ShowSubStr      proc
  184.         push    ax
  185.         push    bx
  186.         push    cx
  187.         push    dx
  188.         mov     ah,     40h     ;вывод в файл
  189.         mov     bx,     1       ;файл - консоль
  190.         mov     cx,     cx      ;количество символов
  191.         mov     dx,     si      ;адрес первого символа
  192.         int     21h
  193.         pop     dx
  194.         pop     cx
  195.         pop     bx
  196.         pop     ax
  197.         ret
  198. ShowSubStr      endp
  199.  
  200. end     main

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

  1. Создание локальных переменных и объявление модели и стэка.
  2. Определение данных:
    • CrLf - последовательность 0Dh, 0Ah, '$'
    • M - константа равная 4
    • N - константа равная 7
    • A - массив из чисел типа слово
    • B - массив из чисел типа слово
    • C - массив из M*N элементов неопределенного значения
    • String - массив из 256 элементов неопределенного значения
    • Pads - массив из 10 элементов, каждый из которых равен пробелу
    • RPad - константа, равная 7
  3. Код:
    • Начало функции main
    • Загрузка сегмента данных в регистр AX и установка его в регистр DS
    • Переменные-указатели si, di, и bx устанавливаются на A, B, и C соответственно
    • Вычисление суммы значений A и B и сохранение результата в C внутри цикла ForIJ
    • Вызов функции ShowMatrix для отображения матрицы C
    • Завершение программы с помощью вызова прерывания 21h функции 4C00h
  4. Процедура Int16ToStr:
    • Преобразование числа в регистре AX в строку
  5. Процедура ShowMatrix:
    • Печать содержимого матрицы C
  6. Процедура ShowSubStr:
    • Печать подстроки Данный код, предположительно, выполняет сложение двух матриц и выводит результат на экран.

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


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

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

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

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

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

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