Ввод массива с клавиатуры - Assembler

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

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

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

Решение задачи: «Ввод массива с клавиатуры»

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

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

В данном коде представлена программа на языке Assembler, которая позволяет пользователю ввести массив чисел, а затем выводит этот массив на экран. Пример ввода и вывода массива: Введите 10 чисел: 5 6 7 8 9 0A 1B 2C 3D 4E 5F Элементы массива: 5 6 7 8 9 0A 1B 2C 3D 4E 5F

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


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

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

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

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

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

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