Ввести строку и взамен пробелов поместить запятую с пробелом - Assembler
Формулировка задачи:
Требуется ввести строку символов, состоящую из отдельных слов, разделенных пробелами. В результирующей строке вставить вместо пробела запятую и пробел. Вывести на экран исходную и результирующую строки.[
Решение задачи: «Ввести строку и взамен пробелов поместить запятую с пробелом»
textual
Листинг программы
.model small
.stack 100h
.data
buf db 255, ?, 255 dup('$') ; для ввода строки с клавиатуры. Структура следующая: <ожидаемое число символов> <фактически введенное число символов> <сама строка>
res db 255 dup ('$')
lblSrc db 'Original string: $'
lblRes db 'Result string: $'
lblInp db 'Enter string: $'
endl db 13,10,'$'
.code
begin:
mov ax, @data
mov ds, ax
mov es, ax
cld
mov ah, 9
lea dx, lblInp ; вывод сообщения о вводе строки
int 21h
mov ah, 0Ah ;
lea dx, buf ; buf - буфер, куда будет помещена вводимая строка
int 21h
mov ah, 9
lea dx, endl ; перевод строки (чтобы не стерлось то, что мы ввели)
int 21h
lea si, buf
add si, 2 ; загружаем адрес строки в si. +2, чтобы не забирать мусор (см. коммент к buf)
lea di, res ; загружаем адрес res в di
mov al, [buf+1] ; для цикла. Фактически введенное кол-во символов.
cbw ; al -> ax
mov cx, ax ; число итераций в cx
m: lodsb ; грузим очередной символ строки source в al
cmp al, ' ' ; сравниваем с пробелом
jne m2 ; если не равно пробелу - goto m2
mov al, ',' ; иначе - в al пишем запятую
stosb ; и эту запятую грузим в res
mov al, ' ' ; в al записываем пробел
m2: stosb ; грузим символ из al в res (destination)
loop m ; цикл. goto m, пока cx != 0
lea dx, lblSrc ; выводим все проделанное нами. "Original string: "
mov ah, 9
int 21h
lea dx, buf+2 ; исходная строка
int 21h
lea dx, endl ; перевод строки
int 21h
lea dx, lblRes ; "Result string: "
int 21h
lea dx, res ; результирующая строка
int 21h
mov ah, 4ch
int 21h
ends
end begin
Объяснение кода листинга программы
- В начале кода подключаются необходимые библиотеки и переменные.
- Переменная buf используется для ввода строки с клавиатуры. Её структура: <ожидаемое число символов> <фактически введенное число символов> <сама строка>.
- Переменная res будет использоваться для хранения результирующей строки.
- Затем происходит вывод сообщения о вводе строки.
- Происходит ввод строки с клавиатуры в буфер buf.
- Выводится перевод строки (чтобы не стерлось то, что мы ввели).
- Загружаются начальные адреса buf и res в si и di соответственно.
- Переменная al получает значение фактически введенного количества символов.
- Запускается цикл, который продолжается до тех пор, пока не будет достигнуто условие выхода из цикла.
- Внутри цикла происходит загрузка очередного символа строки source в al.
- Сравнивается загруженный символ с пробелом.
- Если символ не равен пробелу, то происходит переход к следующей итерации цикла.
- Если символ равен пробелу, то в al записывается запятая, а затем этот символ и запятая записываются в res.
- Затем в al записывается пробел.
- После окончания цикла происходит вывод сообщения
Original string:, а затем исходная строка. - Выводится перевод строки.
- Выводится сообщение
Result string:, а затем результирующая строка. - Завершающая команда, необходимая для корректного завершения работы программы.