Сжать текст, оставив между словами по одному пробелу - Assembler

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

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

Дан текст 30 символов. Сжать текст, оставив между словами по одному пробелу.

Решение задачи: «Сжать текст, оставив между словами по одному пробелу»

textual
Листинг программы
  1. ; fasm-code..
  2. ; Удаляет лишние пробелы
  3. ;--------------------------
  4. org  100h
  5. jmp  start
  6.  
  7. szSrc    db  'We have a string, who haves a     maaany     spaces',13,10,'$'
  8. len      =   ($ - szSrc)-3
  9.  
  10. start:
  11.    mov   ah,9           ; исходная строка
  12.    mov   dx,szSrc
  13.    int   21h
  14. ;=======================================================//
  15.    mov   cx,len         ; длина строки
  16.    mov   si,szSrc       ; адрес для чтения
  17.    mov   di,si          ;   ..и записи.
  18.    xor   ax,ax          ; АХ := 0
  19. cycle:                  ;
  20.    lodsb                ; считать символ
  21.    cmp   al,' '         ; пробел?
  22.    jne   miss           ; нет - пропускаем
  23.    cmp   ax,'  '        ; да - тест с предыдущим
  24.    je    next           ; 2 пробела - пропускаем
  25. miss:                   ;
  26.    stosb                ; перезапись символа
  27. next:                   ;
  28.    xchg  ah,al          ; запомним текущий символ
  29.    loop  cycle          ;
  30.  
  31.    mov   al,'$'         ; вставляем маркер конца стоки
  32.    stosb                ;
  33. ;=======================================================//
  34.    mov   ah,9           ; изменённая строка
  35.    mov   dx,szSrc       ;
  36.    int   21h            ;
  37.  
  38.    xor   ax,ax          ;
  39.    int   16h            ;
  40.    int   20h            ;

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

  1. Создается переменная 'szSrc' для хранения строки, содержащая We have a string, who haves a maaany spaces, а также символы возврата каретки и перевода строки '$'.
  2. Создается переменная 'len' с длиной строки, вычисленной как разница между текущим адресом и адресом 'szSrc', за вычетом 3 байтов (размер символов возврата каретки и перевода строки).
  3. Устанавливается точка входа 'start'.
  4. Вызывается системный вызов DOS для вывода исходной строки на экран.
  5. Устанавливаются регистры и переменные для подготовки к обработке строки.
  6. Цикл начинается, в котором каждый символ строки проверяется на пробел и оставляется только один пробел между словами.
  7. Вставляется символ конца строки '$' в конце обработанной строки.
  8. Вызывается системный вызов DOS для вывода измененной строки на экран.
  9. Программа завершается с вызовом прерывания 20h DOS.

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


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

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

14   голосов , оценка 3.857 из 5

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

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

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