Ввести строку и взамен пробелов поместить запятую с пробелом - 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

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

  1. В начале кода подключаются необходимые библиотеки и переменные.
  2. Переменная buf используется для ввода строки с клавиатуры. Её структура: <ожидаемое число символов> <фактически введенное число символов> <сама строка>.
  3. Переменная res будет использоваться для хранения результирующей строки.
  4. Затем происходит вывод сообщения о вводе строки.
  5. Происходит ввод строки с клавиатуры в буфер buf.
  6. Выводится перевод строки (чтобы не стерлось то, что мы ввели).
  7. Загружаются начальные адреса buf и res в si и di соответственно.
  8. Переменная al получает значение фактически введенного количества символов.
  9. Запускается цикл, который продолжается до тех пор, пока не будет достигнуто условие выхода из цикла.
  10. Внутри цикла происходит загрузка очередного символа строки source в al.
  11. Сравнивается загруженный символ с пробелом.
  12. Если символ не равен пробелу, то происходит переход к следующей итерации цикла.
  13. Если символ равен пробелу, то в al записывается запятая, а затем этот символ и запятая записываются в res.
  14. Затем в al записывается пробел.
  15. После окончания цикла происходит вывод сообщения Original string:, а затем исходная строка.
  16. Выводится перевод строки.
  17. Выводится сообщение Result string:, а затем результирующая строка.
  18. Завершающая команда, необходимая для корректного завершения работы программы.

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

7   голосов , оценка 4.571 из 5
Похожие ответы