Сжатие строки (удаление пробелов и табуляций), найти ошибку - Assembler

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

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

Ввести с клавиатуры строку. Сжать строку, т.е. удалить про¬белы и табуляции. Вывести результаты на экран. Не могу найти ошибку, убираются только первые 2 пробела, остальные игнорируются, и если строка начинается с пробела, то все пробелы игнорируются
Листинг программы
  1. .model small
  2. stack 100h
  3. dataseg
  4. InviteStr db 0Dh, 0Ah, 'Vvedite stroku', 0Dh, 0Ah, '$'
  5. StringINP db 16, ?, 16 dup(?)
  6. StringOUT db 16, ?, 16 dup(?)
  7. codeseg
  8. start:
  9. startupcode
  10. xor SI,SI
  11. xor DI, DI
  12. lea DX, InviteStr ;приглашение ввести первую строку
  13. mov AH, 09h
  14. int 21h
  15. lea DX, StringINP ;ввод строки
  16. mov AH, 0Ah
  17. int 21h
  18. lea SI, StringINP+2 ;взятие адреса входящей строки
  19. lea DI, StringOUT+2 ;взятие адреса исходящей строки
  20. mov CL, StringINP+1
  21. CLD
  22. Check:
  23. lodsb
  24. cmp AL, 20h
  25. je stop
  26. mov DL, AL
  27. mov AH, 02h
  28. int 21h
  29. stop: loop Check
  30. quit:
  31. exitcode 0
  32. end start

Решение задачи: «Сжатие строки (удаление пробелов и табуляций), найти ошибку»

textual
Листинг программы
  1. ;masm/DOS
  2. dos_inp macro   lbl, sz
  3. _ib_    struc  
  4. max db  sz
  5. len db  ?
  6. bf  db  sz dup(?)
  7. _ib_    ends           
  8. lbl _ib_ <>
  9. endm
  10. .model  small
  11. .386
  12. .stack
  13. .data
  14. InviteStr   db 0Dh, 0Ah, 'Vvedite stroku'
  15. crlf    db  0Dh, 0Ah, '$'
  16. dos_inp StringINP, 16
  17.  
  18. .code
  19. start:  mov ax, @data
  20.     mov ds, ax
  21.     mov es, ax
  22.     lea DX, InviteStr       ;приглашение ввести первую строку
  23.     mov AH, 09h
  24.     int 21h
  25.     lea DX, StringINP       ;ввод строки
  26.     mov AH, 0Ah
  27.     int 21h
  28.     lea SI, StringINP.bf    ;взятие адреса входящей строки
  29.     movzx   cx, StringINP.len
  30.     lea dx, crlf
  31.     mov ah, 9
  32.     int 21h
  33. @l:
  34.     lodsb
  35.     cmp AL, 20h
  36.     jz  @F
  37.     cmp al, 09h
  38.     jz  @F
  39.     int 29h
  40. @@:     loop    @l
  41.     xor ax, ax
  42.     int 16h
  43.     mov ax, 4C00h
  44.     int 21h
  45.     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

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

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

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