Сформировать новый массив, элементами которого будут суммы одноименных элементов двух массивов [tasm] - Assembler

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

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

Надо решить задачу Задать с клавиатуры два массива из 10 элементов каждый. Сформировать новый массив, элементами которого будут суммы одноименных элементов двух массивов. Предусмотреть: 1) Приглашение к вводу массива 2) Проверку разрядности вводимых элементов n<3 3)Сообщение об ошибке 4) Вывод сформированного массива На всякий случай, иногда в линковке нужно приписывать +ioproc.obj (например tlink.exe 123.obj+ioproc.obj). Если надо будет, то ioproc у меня есть.

Решение задачи: «Сформировать новый массив, элементами которого будут суммы одноименных элементов двух массивов [tasm]»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         msgInputA       db      'Input A:', 0Dh, 0Ah, '$'
  9.         msgInputB       db      'Input B:', 0Dh, 0Ah, '$'
  10.         msgOutputC      db      'Output C:', 0Dh, 0Ah, '$'
  11.         PromptA         db      'A[', '$'
  12.         PromptB         db      'B[', '$'
  13.         PromptEnd       db      ']=', '$'
  14.         CrLf            db      0Dh, 0Ah, '$'
  15.  
  16.         msgErrorFmt     db      'Format error - non-numeric input', 0Dh, 0Ah, '$'
  17.         msgErrorBig     db      'Too a large number', 0Dh, 0Ah, '$'
  18.  
  19.         SizeArray       equ     10
  20.         A               dw      SizeArray dup (0)
  21.         B               dw      SizeArray dup (0)
  22.         C               dw      SizeArray dup (0)
  23.  
  24.         kbdBuffer       db      6, 0, 6 dup(0)
  25. .code
  26.  
  27. ; выводит число из регистра AX на экран
  28. ; входные данные:
  29. ; ax - число для отображения
  30. Show_AX proc
  31.         push    ax
  32.         push    bx
  33.         push    cx
  34.         push    dx
  35.         push    di
  36.  
  37.         mov     cx, 10          ; cx - основание системы счисления
  38.         xor     di, di          ; di - кол. цифр в числе
  39.  
  40. @@Conv:
  41.         xor     dx, dx
  42.         div     cx              ; dl = num mod 10
  43.         add     dl, '0'         ; перевод в символьный формат
  44.         inc     di
  45.         push    dx              ; складываем в стэк
  46.         or      ax, ax
  47.         jnz     @@Conv
  48.         ; выводим из стэка на экран
  49. @@Show:
  50.         pop     dx              ; dl = очередной символ
  51.         mov     ah, 2           ; ah - функция вывода символа на экран
  52.         int     21h
  53.         dec     di              ; повторяем пока di<>0
  54.         jnz     @@Show
  55.  
  56.         pop     di
  57.         pop     dx
  58.         pop     cx
  59.         pop     bx
  60.         pop     ax
  61.         ret
  62. Show_AX endp
  63.  
  64. ; преобразования строки в беззнаковое число
  65. ; на входе:
  66. ; ds:[si] - строка с числом
  67. ; ds:[di] - адрес числа
  68. ; на выходе
  69. ; ds:[di] - число
  70. ; CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
  71. Str2Num proc
  72.         push    ax
  73.         push    bx
  74.         push    cx
  75.         push    dx
  76.         push    ds
  77.         push    es
  78.  
  79.         push    ds
  80.         pop     es
  81.  
  82.         mov     cl, ds:[si]
  83.         xor     ch, ch
  84.  
  85.         inc     si
  86.  
  87.         mov     bx, 10
  88.         xor     ax, ax
  89.  
  90. @@Loop:
  91.         mul     bx         ; умножаем ax на 10 ( dx:ax=ax*bx )
  92.         mov     [di], ax   ; игнорируем старшее слово
  93.         cmp     dx, 0      ; проверяем, результат на переполнение
  94.         jnz     @@Error
  95.  
  96.         mov     al, [si]   ; Преобразуем следующий символ в число
  97.         cmp     al, '0'
  98.         jb      @@Error
  99.         cmp     al, '9'
  100.         ja      @@Error
  101.         sub     al, '0'
  102.         xor     ah, ah
  103.         add     ax, [di]
  104.         jc      @@Error    ; Если сумма больше 65535
  105.         inc     si
  106.  
  107.         loop    @@Loop
  108.  
  109.         mov     [di], ax
  110.         clc
  111.         pop     es
  112.         pop     ds
  113.         pop     dx
  114.         pop     cx
  115.         pop     bx
  116.         pop     ax
  117.         ret
  118. @@Error:
  119.         xor     ax, ax
  120.         mov     [di], ax
  121.         stc
  122.         pop     es
  123.         pop     ds
  124.         pop     dx
  125.         pop     cx
  126.         pop     bx
  127.         pop     ax
  128.         ret
  129. Str2Num endp
  130.  
  131. ;Ввод массива
  132. ;cx - количество вводимых элементов
  133. ;ds:dx - адрес массива
  134. ;ds:bx - адрес строки приглашения к вводу (первой половинки)
  135. InputArray      proc
  136.         push    ax
  137.         push    bx
  138.         push    cx
  139.         push    dx
  140.         push    si
  141.         push    di
  142.  
  143.         jcxz    @@Exit          ;если массив пустой - завершить
  144.  
  145.         mov     si,     1       ;индекс элемента массива
  146.         mov     di,     dx      ;адрес текущего элемента массива
  147.         @@ForI:
  148.                 ;вывод приглашения ввода элемента
  149.                 mov     ah,     09h
  150.                 ;lea     dx,     PromptA1
  151.                 mov     dx,     bx
  152.                 int     21h
  153.                 mov     ax,     si
  154.                 call    Show_AX
  155.                 mov     ah,     09h
  156.                 lea     dx,     PromptEnd
  157.                 int     21h
  158.                 ;ввод числа
  159.                 mov     ah,     0Ah ;ввод строки
  160.                 mov     dx,     offset kbdBuffer
  161.                 int     21h
  162.                 mov     ah,     09h  ;перевод строки (на новую строку)
  163.                 lea     dx,     CrLf
  164.                 int     21h
  165.  
  166.                 push    si
  167.                 lea     si,     kbdBuffer+1 ; преобразование строки в число
  168.                 call    Str2Num
  169.                 pop     si
  170.  
  171.                 ; проверка на ошибку ввода (формата)
  172.                 jnc     @@NoError
  173.  
  174.                 ; если есть ошибка ввода - показать сообщение и повторить ввод
  175.                 lea     dx,     msgErrorFmt
  176.                 @@ShowErrMsg:
  177.                 ;сообщение об ошибке
  178.                 mov     ah,     09h
  179.                 int     21h
  180.  
  181.                 jmp     @@ForI
  182.  
  183.                 ; если нет ошибки ввода - сохранить число
  184.                 @@NoError:
  185.  
  186.                 ;дополнительная проверка разрядности числа
  187.                 lea     dx,     msgErrorBig
  188.                 cmp     word ptr [di],  1000
  189.                 jge     @@ShowErrMsg
  190.  
  191.                 ;сохранение введённого числоа в массиве
  192.                 ;mov    [di],   ax
  193.                 ;переход к следующему элементу
  194.                 inc     si
  195.                 add     di,     2
  196.         loop    @@ForI
  197. @@Exit:
  198.         pop     di
  199.         pop     si
  200.         pop     dx
  201.         pop     cx
  202.         pop     bx
  203.         pop     ax
  204.         ret
  205. InputArray      endp
  206.  
  207. ;Вывод массива
  208. ;cx - количество вводимых элементов
  209. ;ds:dx - адрес массива
  210. ShowArray       proc
  211.         push    ax
  212.         push    bx
  213.         push    cx
  214.         push    dx
  215.         push    si
  216.         push    di
  217.  
  218.         jcxz    @@Exit          ;если массив пустой - завершить
  219.  
  220.         mov     si,     1       ;индекс элемента массива
  221.         mov     di,     dx      ;адрес текущего элемента массива
  222.         @@ForI:
  223.                 mov     ax,     [di]
  224.                 call    Show_AX
  225.                 mov     ah,     02h
  226.                 mov     dl,     ' '
  227.                 int     21h
  228.                 ;переход к следующему элементу
  229.                 inc     si
  230.                 add     di,     2
  231.         loop    @@ForI
  232. @@Exit:
  233.         pop     di
  234.         pop     si
  235.         pop     dx
  236.         pop     cx
  237.         pop     bx
  238.         pop     ax
  239.         ret
  240. ShowArray       endp
  241.  
  242. main    proc
  243.         mov     ax,     @data
  244.         mov     ds,     ax
  245.         ;ввод массива A
  246.         mov     ah,     09h
  247.         lea     dx,     msgInputA
  248.         int     21h
  249.         mov     cx,     SizeArray
  250.         lea     dx,     A
  251.         lea     bx,     PromptA
  252.         call    InputArray
  253.         ;ввод массива B
  254.         mov     ah,     09h
  255.         lea     dx,     msgInputB
  256.         int     21h
  257.         mov     cx,     SizeArray
  258.         lea     dx,     B
  259.         lea     bx,     PromptB
  260.         call    InputArray
  261.  
  262.         ;вычисление массива C
  263.         mov     si,     0
  264.         mov     cx,     SizeArray
  265. @@For:
  266.         mov     ax,     A[si]
  267.         add     ax,     B[si]
  268.         mov     C[si],  ax      ;C[si]:=A[si]+B[si]
  269.         add     si,     2       ;увеличиваем смещение в массиве на размер элемента
  270.         loop    @@For
  271.  
  272.         ;вывод массива C
  273.         mov     ah,     09h
  274.         lea     dx,     msgOutputC
  275.         int     21h
  276.         lea     dx,     C
  277.         mov     cx,     SizeArray
  278.         call    ShowArray
  279.  
  280.         mov     ax,     4C00h
  281.         int     21h
  282. main    endp
  283.  
  284. end     main

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


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

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

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

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

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

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