Из символьного массива удалить группы цифр, записанных подряд - Assembler
Формулировка задачи:
Задали символьный масив С(n) n<=700... Разработать программу, которая находить и извлекает групы цифр, записаных подряд. Выводить модифицированый масив
Решение задачи: «Из символьного массива удалить группы цифр, записанных подряд»
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
Объяснение кода листинга программы
- Объявление переменных в сегменте данных:
- Название переменной:
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
, значение: перевод строки
- Название переменной:
- Переход в сегмент кода
- Определение процедуры
main
:- Загрузка адреса сегмента данных в
ax
, перемещение вds
- Вывод исходной строки
- Обработка строки посимвольно и вывод символов
- Загрузка адреса сегмента данных в
- Определение процедуры
ShowSubStr
:- Процедура для вывода подстроки
- Завершение процедуры
main
и программы Данный код обрабатывает строку, удаляя группы цифр и выводя оставшиеся символы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д