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

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

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

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

textual
LOCALS
 
.model small
 
.stack 100h
 
.data
        ;строка для обработки
        S       db      "A California-based cybersecurity firm found "
                db      "a database of nearly 200 million American "
                db      "voters - along with their preferences and "
                db      "modeling data - left unsecured on an Amazon "
                db      "cloud server by data contractors working on "
                db      "Donald Trump's 2016 presidential bid."
                db      0Dh, 0Ah
                db      "https://www.com/usa/393124-rnc-database-millions-exposed/"
                db      0Dh, 0Ah
                db      "7-1:123+1234=4*43\432%4321-0"
        Len     dw      $-S
        ;параметры групп цифр в сообщении (параметры очереди)
        QSize   equ     1               ;допустимое количество цифр в группе
        Queue   db      QSize dup(?)    ;очередь символов
        QLen    dw      0               ;длина очереди
        ;сообщения программы
        CrLf    db      0Dh, 0Ah, '$'   ;перевод строки
 
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        ;показать исходную строку
        lea     si,     [S]
        mov     cx,     Len
        call    ShowSubStr
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
        int     21h
 
        ;обработка и посимвольный вывод строки
        lea     si,     [S]
        mov     cx,     Len
        lea     di,     [Queue]
        mov     QLen,   0
        cld
@@For:
        lodsb
        cmp     al,     '0'
        jb      @@TestQueue
        cmp     al,     '9'
        ja      @@TestQueue
        ;если считан символ цыфры - помещаем его в очередь
        ;(с учётом переполнения)
        inc     QLen
        cmp     QLen,   QSize
        ja      @@QueueOverflow
        mov     bx,     QLen
        dec     bx
        mov     [di+bx],        al
@@QueueOverflow:
        jmp     @@NextChar
@@TestQueue:
        ;если все цифры завершились - проверяем очередь
        ;если она переполнена (больше размера) - очишаем
        ;если в очереди количество символов не больше требуемых - выводим их
        ;если очередь пустая - сразу переходим к выводу текущего символа
        cmp     QLen,   QSize
        ja      @@ClearQueue
        cmp     QLen,   0
        je      @@ShowChar
@@ShowQueue:
        push    si
        push    cx
        lea     si,     [Queue]
        mov     cx,     QLen
        call    ShowSubStr
        pop     cx
        pop     si
@@ClearQueue:
        mov     QLen,   0
@@ShowChar:
        int     29h
@@NextChar:
        loop    @@For
        ;если после завершения цикла осталась непустая непереполненная очередь
        ;то вывести её
        cmp     QLen,   QSize
        ja      @@SkipShowQueue
        lea     si,     [Queue]
        mov     cx,     QLen
        call    ShowSubStr
@@SkipShowQueue:
 
        mov     ax,     4C00h
        int     21h
main    endp
 
;процедура вывода подстроки
;на входе:
;  ds:si - адрес первого символа подстроки
;  cx    - длина выводимой подсторки
ShowSubStr      proc
        push    ax
        push    bx
        push    cx
        push    dx
        mov     ah,     40h
        mov     bx,     1
        mov     cx,     cx
        mov     dx,     si
        int     21h
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
ShowSubStr      endp
 
end     main

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


СОХРАНИТЬ ССЫЛКУ