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

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

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

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

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

textual
Листинг программы
; fasm-code..
; Удаляет лишние пробелы
;--------------------------
org  100h
jmp  start
 
szSrc    db  'We have a string, who haves a     maaany     spaces',13,10,'$'
len      =   ($ - szSrc)-3
 
start:
   mov   ah,9           ; исходная строка
   mov   dx,szSrc
   int   21h
;=======================================================//
   mov   cx,len         ; длина строки
   mov   si,szSrc       ; адрес для чтения
   mov   di,si          ;   ..и записи.
   xor   ax,ax          ; АХ := 0
cycle:                  ;
   lodsb                ; считать символ
   cmp   al,' '         ; пробел?
   jne   miss           ; нет - пропускаем
   cmp   ax,'  '        ; да - тест с предыдущим
   je    next           ; 2 пробела - пропускаем
miss:                   ;
   stosb                ; перезапись символа
next:                   ;
   xchg  ah,al          ; запомним текущий символ
   loop  cycle          ;
 
   mov   al,'$'         ; вставляем маркер конца стоки
   stosb                ;
;=======================================================//
   mov   ah,9           ; изменённая строка
   mov   dx,szSrc       ;
   int   21h            ;
 
   xor   ax,ax          ;
   int   16h            ;
   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
Похожие ответы