Сжатие строки (удаление пробелов и табуляций), найти ошибку - Assembler
Формулировка задачи:
Ввести с клавиатуры строку. Сжать строку, т.е. удалить про¬белы и табуляции. Вывести результаты на экран.
Не могу найти ошибку, убираются только первые 2 пробела, остальные игнорируются, и если строка начинается с пробела, то все пробелы игнорируются
Листинг программы
- .model small
- stack 100h
- dataseg
- InviteStr db 0Dh, 0Ah, 'Vvedite stroku', 0Dh, 0Ah, '$'
- StringINP db 16, ?, 16 dup(?)
- StringOUT db 16, ?, 16 dup(?)
- codeseg
- start:
- startupcode
- xor SI,SI
- xor DI, DI
- lea DX, InviteStr ;приглашение ввести первую строку
- mov AH, 09h
- int 21h
- lea DX, StringINP ;ввод строки
- mov AH, 0Ah
- int 21h
- lea SI, StringINP+2 ;взятие адреса входящей строки
- lea DI, StringOUT+2 ;взятие адреса исходящей строки
- mov CL, StringINP+1
- CLD
- Check:
- lodsb
- cmp AL, 20h
- je stop
- mov DL, AL
- mov AH, 02h
- int 21h
- stop: loop Check
- quit:
- exitcode 0
- end start
Решение задачи: «Сжатие строки (удаление пробелов и табуляций), найти ошибку»
textual
Листинг программы
- ;masm/DOS
- dos_inp macro lbl, sz
- _ib_ struc
- max db sz
- len db ?
- bf db sz dup(?)
- _ib_ ends
- lbl _ib_ <>
- endm
- .model small
- .386
- .stack
- .data
- InviteStr db 0Dh, 0Ah, 'Vvedite stroku'
- crlf db 0Dh, 0Ah, '$'
- dos_inp StringINP, 16
- .code
- start: mov ax, @data
- mov ds, ax
- mov es, ax
- lea DX, InviteStr ;приглашение ввести первую строку
- mov AH, 09h
- int 21h
- lea DX, StringINP ;ввод строки
- mov AH, 0Ah
- int 21h
- lea SI, StringINP.bf ;взятие адреса входящей строки
- movzx cx, StringINP.len
- lea dx, crlf
- mov ah, 9
- int 21h
- @l:
- lodsb
- cmp AL, 20h
- jz @F
- cmp al, 09h
- jz @F
- int 29h
- @@: loop @l
- xor ax, ax
- int 16h
- mov ax, 4C00h
- int 21h
- end start
Объяснение кода листинга программы
- В начале кода определен макроопределение
dos_inp
, которое используется для ввода строки с помощью функции BIOSint 21h
. - Строка, которую необходимо ввести, представлена в сегменте данных (
data segment
) и содержит приглашение для ввода строки. - После ввода строки, её адрес сохраняется в переменной
StringINP
, а её длина сохраняется в переменнойStringINP.len
. - Затем, в цикле, происходит проход по каждому символу входной строки. Если символ является пробелом или табуляцией, он пропускается, а если это не пробел или табуляция, он добавляется в выходную строку.
- При достижении символа новой строки или конца строки, цикл завершается.
- После завершения цикла, в цикле
while
добавляется символ новой строки, и цикл завершается. - После этого, код завершается с помощью функции
int 21h
с кодом выхода 4C00h. Список ошибок: - Не указан сегмент для переменных
StringINP
,bf
иlen
. - Переменная
bf
не используется в коде. - Переменная
len
не используется в коде, кроме как для вычисления длины строки. - При вычислении длины строки, возможно, будет деление на ноль, если строка пуста.
- В цикле, где происходит обработка каждого символа входной строки, не обрабатывается случай, когда символ равен 0Dh (символ новой строки).
- После обработки каждого символа входной строки, не выполняется переход к следующему символу.
- При добавлении символа в выходную строку, не выполняется проверка на переполнение буфера.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д