Найти в каждой заданной строке количество символов "5" - Assembler

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

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

Задать с клавиатуры две строки десятичных чисел,одна стока приемник,вторая-источник.Найти в каждой строке количество символов со знаком "5".Вывести на экран найденное количество "5" в каждой строке

Решение задачи: «Найти в каждой заданной строке количество символов "5"»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8. MaxLen          equ     20
  9. s1              db      MaxLen dup(0)
  10. s2              db      MaxLen dup(0)
  11. kbdBuffer       db      MaxLen+1, 0, (MaxLen+1) dup(0)
  12. PromptS1        db      'Input first string: ', '$'
  13. PromptS2        db      'Input second string: ', '$'
  14. msgInFirst      db      'In first string: ', '$'
  15. msgInSecond     db      'In second string: ', '$'
  16. CrLf            db      0Dh, 0Ah, '$'
  17. Count1          dw      0
  18. Count2          dw      0
  19. .code
  20.  
  21. main    proc
  22.         mov     ax,     @data
  23.         mov     ds,     ax
  24.  
  25.         ;обработка первой строки
  26.         mov     ah,     09h
  27.         lea     dx,     PromptS1
  28.         int     21h
  29.         lea     dx,     s1
  30.         call    Process
  31.         mov     Count1, ax
  32.         ;обработка второй строки
  33.         mov     ah,     09h
  34.         lea     dx,     PromptS2
  35.         int     21h
  36.         lea     dx,     s2
  37.         call    Process
  38.         mov     Count2, ax
  39.         ;вывод результата
  40.         mov     ah,     09h
  41.         lea     dx,     msgInFirst
  42.         int     21h
  43.         mov     ax,     Count1
  44.         call    OutInt
  45.         mov     ah,     09h
  46.         lea     dx,     CrLf
  47.         int     21h
  48.         ;вывод результата
  49.         mov     ah,     09h
  50.         lea     dx,     msgInSecond
  51.         int     21h
  52.         mov     ax,     Count2
  53.         call    OutInt
  54.         mov     ah,     09h
  55.         lea     dx,     CrLf
  56.         int     21h
  57.  
  58.         mov     ax,     4C00h
  59.         int     21h
  60. main    endp
  61.  
  62. ;обработка строки
  63. ;на входе
  64. ;ds:dx - адрес строки
  65. ;на выходе
  66. ;ax - количество символов '5' в строке
  67. Process proc
  68.         ;push   ax
  69.         push    bx
  70.         push    cx
  71.         push    dx
  72.         push    si
  73.         push    di
  74.  
  75.         call    ReadStr
  76.  
  77.         mov     si,     dx      ;адрес начала строки
  78.         mov     bx,     0       ;количество символов '5' в строке
  79. @@While:
  80.         mov     al,     [si]    ;чтение очередного символа
  81.         cmp     al,     '$'
  82.         je      @@Break         ;если это символ - признак конца строки - выйти
  83.         cmp     al,     '5'     ;если это символ '5',
  84.         jne     @@Next
  85.         inc     bx              ;то увеличить счётчик
  86. @@Next:
  87.         add     si,     1       ;перейти к следующему элементу строки
  88.         jmp     @@While
  89. @@Break:
  90.         mov     ax,     bx      ;запись результата в регистр ax
  91.  
  92.         pop     di
  93.         pop     si
  94.         pop     dx
  95.         pop     cx
  96.         pop     bx
  97.         ;pop    ax
  98.         ret
  99. Process endp
  100.  
  101. ;чтение строки с клавиатуры
  102. ;на входе
  103. ;ds:dx - адрес строки
  104. ReadStr proc
  105.         push    ax
  106.         push    bx
  107.         push    cx
  108.         push    dx
  109.         push    si
  110.         push    di
  111.         ;сохранение адреса введённой строки
  112.         mov     di,     dx
  113.         ;чтение в буфер из клавиатуры
  114.         mov     ah,     0Ah
  115.         lea     dx,     kbdBuffer
  116.         int     21h
  117.         ;копирование из буфера в переменную строки
  118.         mov     cx,     0
  119.         mov     cl,     [kbdBuffer+1]
  120.         jcxz    @@SkipCopy
  121.         push    es
  122.         pushf
  123.         push    ds
  124.         pop     es
  125.         lea     si,     kbdBuffer+2
  126.         mov     di,     di
  127.         cld
  128.         rep     movsb
  129.         popf
  130.         pop     es
  131.         ;добавление признака конца строки
  132.         mov     byte ptr [di],  '$'
  133. @@SkipCopy:
  134.         mov     ah,     09h
  135.         lea     dx,     CrLf
  136.         int     21h
  137.         pop     di
  138.         pop     si
  139.         pop     dx
  140.         pop     cx
  141.         pop     bx
  142.         pop     ax
  143.         ret
  144. ReadStr endp
  145.  
  146. OutInt  proc
  147.         push    ax
  148.         push    dx
  149.         aam
  150.         add     ax,     '00'
  151.         mov     dl,     ah
  152.         mov     dh,     al
  153.         mov     ah,     02
  154.         int     21h
  155.         mov     dl,dh
  156.         int     21h
  157.         pop     dx
  158.         pop     ax
  159.         ret
  160. OutInt  endp
  161.  
  162. end     main

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


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

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

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

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

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

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