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

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

Похожие вопросы
- Помогите найти ошибку Delphi легкая программка
- программирование C++. Помогите найти ошибку
- Помогите найти ошибку в коде
- помогите найти ошибку на С++..помогите пожалуйста))
- Помогите найти ошибку qbasic
- Помогите найти ошибку в коде. делфи
- помогите найти ошибку в коде на Си
- Помогите найти ошибку в задачи,Паскаль...
- Всем добрый вечер) пожалуйста,помогите найти ошибку в программе-->
- Помогите найти ошибки в коде (паскаль)