Шаг 52.
Пример решения задачи на обработку строк

    На этом шаге мы приведем программу, обрабатывающую строки.

    Текст программы содержит комментарии, которые объясняют принцип ее работы.


    Пример. Написать программу, которая удаляет в данном тексте все лишние пробелы (без учета концевых пробелов).
        TITLE Задача 52_1.
        ;Написать программу, которая удаляет в данном тексте все лишние пробелы 
        ;(без учета концевых пробелов).
        ;Программа сделана как EXE-файл.
        ;-------------------------------
        EXTRN Clear:FAR,Write_Str:FAR,Cursor:FAR
        ;----- Сегмент стека
StackSg SEGMENT PARA STACK 'Stack'
DW      256  DUP(?)
StackSg ENDS
        ;----- Сегмент данных
DataSg  SEGMENT PARA PUBLIC
STR1    DB  "Задайте исходную строку: $"
STR2    DB  "Результирующая строка: $"
BUFFER  LABEL  BYTE          ;Список параметров:
MAXLEN  DB     250           ;  максимальная длина;
ACTLEN  DB     ?             ;  реальная длина;
NAMEFLD DB     251 DUP ("$") ;  введенные символы.
DataSg  ENDS
        ;----- Сегмент кода
CodeSg  SEGMENT  PARA  PUBLIC
        ASSUME CS: CodeSg, DS:DataSg, SS: StackSg
Begin   PROC  FAR
        ;Пролог EXE-файла.
        PUSH DS
        XOR AX,AX
        PUSH AX
        MOV AX,DataSg
        MOV DS,AX 
        MOV ES,AX   ;Инициализация регистра ES.
        ;Конец пролога.
        CALL Clear     ;Очистка экрана.
        MOV  DX,0000h
        CALL Cursor    ;Установка курсора.
        LEA  DX,STR1
        CALL Write_Str
        MOV  DX,0100h
        CALL Cursor    ;Установка курсора.
        ;--------------Ввод строки.
        MOV  AH,0AH    ;Запрос функции ввода.
        LEA  DX,BUFFER ;Загрузить адрес списка параметров.
        INT  21H       ;Вызвать DOS-прерывание.
        MOV  AX,0
        MOV  AL,ACTLEN
        MOV  SI,AX
        MOV  BYTE PTR NAMEFLD[SI],'$' ;Поместим признак конца строки.
        ;--------------Проверим, нет ли пробелов сначала строки.
        ;--------------Если есть, то удалим их.
        CALL Beg_Space
        ;Будем искать пару пробелов в строке.
        ;Когда найдем, то удалим второй из них 
        ;путем сдвижки строки на один символ влево
        ;на место второго из найденных пробелов.
        ;Процесс будем повторять до тех пор,
        ;пока в строке есть пара пробелов.
PROD:
        MOV  CX,0
        MOV  AX,2020h
        MOV  CL,ACTLEN ;Длина строки
        LEA  DI,NAMEFLD;Адрес начала строки
        REPNE SCASW    ;Ищем пару пробелов.
        JNZ  EXT       ;Нет двух рядом стоящих пробелов - выход.
        MOV  SI,DI
        DEC  SI   ;Откуда копировать.
        SUB  DI,2 ;Куда.
        REP MOVSB       ;Перемещение строки.
        JMP  PROD       ;Повторение операции

EXT:    ;-------------Вывод результата.
        MOV  DX,0500h
        CALL Cursor    ;Установка курсора.
        LEA  DX,STR2
        CALL Write_Str
        MOV  DX,0600h
        CALL Cursor    ;Установка курсора.
        LEA  DX,NAMEFLD
        CALL Write_Str
        MOV  AH,1      ;Задержка.
        INT  21H
        RET
Begin	ENDP
;---------------- Процедура удаления начальных пробелов.
Beg_Space  PROC
           PUSH CX
           PUSH AX
           PUSH BX
           XOR  CX,CX
           XOR  AX,AX
           XOR  BX,BX
           CLD
           MOV  AL,' '    ;Искомый символ.
           MOV  CL,ACTLEN ;Длина строки.
           MOV  BL,CL
           DEC  BL
           LEA  DI,NAMEFLD;Адрес строки.
           REPE SCASB     ;Поиск символа, отличного от пробела.
           CMP  CL,BL     ;Если нет пробелов вначале строки,
                          ;то CX будет на единицу меньше.
                          ;CX уменьшилось на 1?
           JE   EXIT      ;Да - вначале строки пробелы отсутствуют. 
           ;--------------Удалим лишние пробелы.
           DEC  DI
           MOV  SI,DI      ;Откуда.
           LEA  DI,NAMEFLD ;Куда.
           MOV  CL,ACTLEN  ;Количество повторений.
           REP MOVSB       ;Перемещение строки.
EXIT:
           POP  BX
           POP  AX
           POP  CX
           RET
Beg_Space  ENDP
CodeSg  ENDS
        END Begin
Текст этой программы можно взять здесь.

    Со следующего шага мы начнем рассматривать работу с файлами.




Предыдущий шаг Содержание Следующий шаг