Ввод массива и вывод из него на экран сначала чётных, а потом нечётных символов - Assembler

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

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

Нужно ввести массив и вывести из него на экран сначала чётные символы,а потом нечётные заранее спасибо

Решение задачи: «Ввод массива и вывод из него на экран сначала чётных, а потом нечётных символов»

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

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

  1. В блоке .data определяются переменные:
    • PromptN - строка для приглашения ввода числа N
    • PromptA1 - строка для приглашения ввода элемента массива
    • PromptA2 - строка для вывода символа ']'
    • CrLf - строка для перевода на новую строку
    • msgEven - строка для вывода чётных элементов
    • msgOdd - строка для вывода нечётных элементов
    • N - переменная для хранения размера массива
    • A - массив для хранения элементов
    • kbdBuffer - массив для буфера клавиатуры
  2. В блоке .code определяются процедуры:
    • Show_AX - процедура для вывода числа из регистра AX на экран
    • Str2Num - процедура для преобразования строки в беззнаковое число
    • InputArray - процедура для ввода массива
  3. В процедуре main:
    • @@InputN - происходит ввод числа N и его преобразование в беззнаковое число
    • call InputArray - вызов процедуры для ввода массива
    • Далее выполняется вывод на экран чётных и нечётных элементов массива. Таким образом, данный код описывает работу с массивом: ввод числа N, ввод массива и вывод чётных и нечётных элементов массива на экран.

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


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

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

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

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

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

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