Сжатие строки (удаление пробелов и табуляций), найти ошибку - 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

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

  1. В начале кода определен макроопределение dos_inp, которое используется для ввода строки с помощью функции BIOS int 21h.
  2. Строка, которую необходимо ввести, представлена в сегменте данных (data segment) и содержит приглашение для ввода строки.
  3. После ввода строки, её адрес сохраняется в переменной StringINP, а её длина сохраняется в переменной StringINP.len.
  4. Затем, в цикле, происходит проход по каждому символу входной строки. Если символ является пробелом или табуляцией, он пропускается, а если это не пробел или табуляция, он добавляется в выходную строку.
  5. При достижении символа новой строки или конца строки, цикл завершается.
  6. После завершения цикла, в цикле while добавляется символ новой строки, и цикл завершается.
  7. После этого, код завершается с помощью функции int 21h с кодом выхода 4C00h. Список ошибок:
  8. Не указан сегмент для переменных StringINP, bf и len.
  9. Переменная bf не используется в коде.
  10. Переменная len не используется в коде, кроме как для вычисления длины строки.
  11. При вычислении длины строки, возможно, будет деление на ноль, если строка пуста.
  12. В цикле, где происходит обработка каждого символа входной строки, не обрабатывается случай, когда символ равен 0Dh (символ новой строки).
  13. После обработки каждого символа входной строки, не выполняется переход к следующему символу.
  14. При добавлении символа в выходную строку, не выполняется проверка на переполнение буфера.

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


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

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

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