Другие языки программирования и технологии

Помогите найти ошибку. Пожалуйста. Ассемблер.

;Нужно удалить определённый символ в строке.
Вводим строку потом ищем определённый символ, который тоже вводим с клавы и перезаписываем символы в строке (сдвигаем) . Почему не работает не врубаюсь. Уже и построчно компилил не знаю может не врубился во что-то. Асм в универе изучаем не так давно, пока не очень шарю =) Помогите добрые люди. Ну и злые тоже.
Вот код.

.model tiny
.386
.stack 128
; удобные директивы
LOCALS @@ ; метки, начиающиеся с двух селедок - локальные - можно повторять
JUMPS ; генерируется код, при котором возможны условные переходы дальше 128 байт
.data
msg_press db 13,10,'Press any key ...','$'
msg_char db 13,10,'Vvedite simvol dlya udaleniya: ','$'
del_char db ?
msg_string db 'Vvedite stroku:',13,10,'$'
msg_after db 13,10,'Obrabotannayz stroka:',13,10,'$'
buf_len equ 255
in_len dw ?
msg_str_empty db 13,10,'Pustaya stroka','$'
buf db buf_len,buf_len dup (?) ; место для строки
.code
start:
movax,@data
movds,ax
mov ax, 3
int 10h
lea dx, msg_string
mov ah, 9
int 21h

mov ah, 0Ah ; удобная функция для ввода строк
lea dx, buf
int 21h

; длина фактического ввода = второй байт
; первый байт = заданная максимальная длина ввода
lea si, buf
inc si
mov cl, [si]
xor ch, ch ; теперь в СХ - длина ввода
; сохраним
mov in_len, cx
; заменим последний байт на 0 - это будет маркер
add si, cx
inc si
mov byte ptr [si], 0

extended:
lea dx, msg_char
mov ah, 9
int 21h

xor ax, ax
int 16h
or al, al
jz extended ; расширенные проигнорируем
mov del_char, al
; покажем
int 29h

cld ; буду использовать строковые инструкции
lea si, buf
add si, 2 ; пропустим байты длины
@@_next:
lodsb
dec cx
or al, al ; достигнут 0?
jz @@_done
cmp al, del_char
jne @@_next
; удаление сводится к перемещению символов
push cx ; сохраним СХ
push si
inc cx ; число анализируемых символов уже уменьшего - для данного случая - зря
dec si ; Сейчас SI указывает на следующий символ
mov di, si
inc si
REP movsb
pop si
pop cx
jmp @@_next
@@_done:

lea dx, msg_after
mov ah, 9
int 21h

lea dx, buf
add dx, 2
mov bx, 1
mov cx, 100
mov ah, 40h ; лучше подходит, чем 9-я, так как в строке могут быть символы $
int 21h

movax,4c00h
int21h
end start
.stack 128
Попробуй 256 или 100h

На текущий момент, дальше не читал
Ludmil Neo
Ludmil Neo
37 544
Лучший ответ
.model small ; в модели tiny не предусматривается сегментов
jumps ; Для процессора i80386 не нужна
.386
.stack 128

.data
msg_press db 13,10,'Press any key ...','$'
msg_char db 13,10,'Введите символ для удаления: ','$'
del_char db ?
msg_string db 'Введите строку: ',13,10,'$'
msg_after db 13,10,'Обработанная строка: ',13,10,'$'
buf_len equ 255
in_len dw ?
msg_str_empty db 13,10,'Pustaya stroka','$' ; Длина строки нигде не проверяется на равенство нулю
buf db buf_len, ?, buf_len dup (?) ; Забыли байт для длины введённой строки

.code
start:
    mov ax,@data
    mov ds,ax
    mov es,ax ; команда movsb использует дополнительный сегмент
    mov ax, 3
    int 10h
    lea dx, msg_string
    mov ah, 9
    int 21h

    mov ah, 0Ah
    lea dx, buf
    int 21h

    lea si, buf
    inc si
    mov cl, [si]
    xor ch, ch

    mov in_len, cx

    add si, cx
    inc si
    mov byte ptr [si], 0

    lea dx, msg_char
    mov ah, 9
    int 21h

extended: ; Незачем повторять запрос, если код символа не выводится в консоль
    xor ax, ax
    int 16h
    or al, al
    jz extended
    mov del_char, al
    int 29h

    cld
    lea si, buf
    add si, 2
@@_next:
    lodsb
    dec cx
    or al, al
    jz @@_done
    cmp al, del_char
    jne @@_next

    push cx
    push si
    inc cx
    dec si
    mov di, si
    inc si
    REP movsb
    pop si
    dec si ; Иначе будет пропущен один символ
    dec word ptr in_len ; Нужно уменьшить длину строки
    pop cx
    jmp @@_next
@@_done:

    lea dx, msg_after
    mov ah, 9
    int 21h

    lea dx, buf
    add dx, 2
    mov bx, 1
    mov cx, in_len ; Нужно загрузить длину получившейся строки
    mov ah, 40h
    int 21h

    lea dx,msg_press ; Ожидание нажатия пользователем любой клавиши
    mov ah,9
    int 21h
    xor ah,ah
    int 16h

    mov ax,4c00h
    int 21h
    end start

Дима Оселедько
Дима Оселедько
51 590