Из символьного массива удалить группы цифр, записанных подряд - Assembler

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

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

Задали символьный масив С(n) n<=700... Разработать программу, которая находить и извлекает групы цифр, записаных подряд. Выводить модифицированый масив

Решение задачи: «Из символьного массива удалить группы цифр, записанных подряд»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         ;строка для обработки
  9.         S       db      "A California-based cybersecurity firm found "
  10.                 db      "a database of nearly 200 million American "
  11.                 db      "voters - along with their preferences and "
  12.                 db      "modeling data - left unsecured on an Amazon "
  13.                 db      "cloud server by data contractors working on "
  14.                 db      "Donald Trump's 2016 presidential bid."
  15.                 db      0Dh, 0Ah
  16.                 db      "https://www.com/usa/393124-rnc-database-millions-exposed/"
  17.                 db      0Dh, 0Ah
  18.                 db      "7-1:123+1234=4*43\432%4321-0"
  19.         Len     dw      $-S
  20.         ;параметры групп цифр в сообщении (параметры очереди)
  21.         QSize   equ     1               ;допустимое количество цифр в группе
  22.         Queue   db      QSize dup(?)    ;очередь символов
  23.         QLen    dw      0               ;длина очереди
  24.         ;сообщения программы
  25.         CrLf    db      0Dh, 0Ah, '$'   ;перевод строки
  26.  
  27. .code
  28.  
  29. main    proc
  30.         mov     ax,     @data
  31.         mov     ds,     ax
  32.  
  33.         ;показать исходную строку
  34.         lea     si,     [S]
  35.         mov     cx,     Len
  36.         call    ShowSubStr
  37.         mov     ah,     09h
  38.         lea     dx,     [CrLf]
  39.         int     21h
  40.         int     21h
  41.  
  42.         ;обработка и посимвольный вывод строки
  43.         lea     si,     [S]
  44.         mov     cx,     Len
  45.         lea     di,     [Queue]
  46.         mov     QLen,   0
  47.         cld
  48. @@For:
  49.         lodsb
  50.         cmp     al,     '0'
  51.         jb      @@TestQueue
  52.         cmp     al,     '9'
  53.         ja      @@TestQueue
  54.         ;если считан символ цыфры - помещаем его в очередь
  55.         ;(с учётом переполнения)
  56.         inc     QLen
  57.         cmp     QLen,   QSize
  58.         ja      @@QueueOverflow
  59.         mov     bx,     QLen
  60.         dec     bx
  61.         mov     [di+bx],        al
  62. @@QueueOverflow:
  63.         jmp     @@NextChar
  64. @@TestQueue:
  65.         ;если все цифры завершились - проверяем очередь
  66.         ;если она переполнена (больше размера) - очишаем
  67.         ;если в очереди количество символов не больше требуемых - выводим их
  68.         ;если очередь пустая - сразу переходим к выводу текущего символа
  69.         cmp     QLen,   QSize
  70.         ja      @@ClearQueue
  71.         cmp     QLen,   0
  72.         je      @@ShowChar
  73. @@ShowQueue:
  74.         push    si
  75.         push    cx
  76.         lea     si,     [Queue]
  77.         mov     cx,     QLen
  78.         call    ShowSubStr
  79.         pop     cx
  80.         pop     si
  81. @@ClearQueue:
  82.         mov     QLen,   0
  83. @@ShowChar:
  84.         int     29h
  85. @@NextChar:
  86.         loop    @@For
  87.         ;если после завершения цикла осталась непустая непереполненная очередь
  88.         ;то вывести её
  89.         cmp     QLen,   QSize
  90.         ja      @@SkipShowQueue
  91.         lea     si,     [Queue]
  92.         mov     cx,     QLen
  93.         call    ShowSubStr
  94. @@SkipShowQueue:
  95.  
  96.         mov     ax,     4C00h
  97.         int     21h
  98. main    endp
  99.  
  100. ;процедура вывода подстроки
  101. ;на входе:
  102. ;  ds:si - адрес первого символа подстроки
  103. ;  cx    - длина выводимой подсторки
  104. ShowSubStr      proc
  105.         push    ax
  106.         push    bx
  107.         push    cx
  108.         push    dx
  109.         mov     ah,     40h
  110.         mov     bx,     1
  111.         mov     cx,     cx
  112.         mov     dx,     si
  113.         int     21h
  114.         pop     dx
  115.         pop     cx
  116.         pop     bx
  117.         pop     ax
  118.         ret
  119. ShowSubStr      endp
  120.  
  121. end     main

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

  1. Объявление переменных в сегменте данных:
    • Название переменной: S, значение: A California-based cybersecurity firm found a database of nearly 200 million American voters - along with their preferences and modeling data - left unsecured on an Amazon cloud server by data contractors working on Donald Trump's 2016 presidential bid.
    • Название переменной: Len, значение: длина строки S
    • Название переменной: QSize, значение: 1 (допустимое количество цифр в группе)
    • Название переменной: Queue, значение: пустой массив длиной QSize
    • Название переменной: QLen, значение: 0 (длина очереди)
    • Название переменной: CrLf, значение: перевод строки  
  2. Переход в сегмент кода  
  3. Определение процедуры main:
    • Загрузка адреса сегмента данных в ax, перемещение в ds
    • Вывод исходной строки
    • Обработка строки посимвольно и вывод символов
  4. Определение процедуры ShowSubStr:
    • Процедура для вывода подстроки
  5. Завершение процедуры main и программы Данный код обрабатывает строку, удаляя группы цифр и выводя оставшиеся символы.

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


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

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

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

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

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

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