Удаление конкретных символов из строки, запись результатов в файл - Assembler
Формулировка задачи:
Добрый день, присутствует такая проблема, условие задачи стоит так: Ввести с клавиатуры название файла, затем ввести строку, из которой необходимо удалить конкретный символ (в данном случае пробел) и записать результаты в файл с именем из первого ввода и содержанием в виде двух строк: 1. Введенная строка, 2. Результирующая строка без символов (пробела).
На данный момент имеется такой код, прошу помогите найти причину. Этот пример имеет фиксированный файл и путь, он выполняет все действия КРОМЕ УДАЛЕНИЯ СИМВОЛА, тут он просто заменяется тем же, только на регистр выше. Помогите изменить код так, чтобы он удовлетворял условию задачи.
data segment
msg db 255, 0, 255 dup ('$'), '$'
file_name db 'C:\output.txt',0
error_msg db 'Error! Could not handle file $'
msg_size db 0
handler dw 0
data ends
code segment
assume cs:code, ds:data
read_from_keyboard proc
mov ah, 0ah
lea dx, msg
int 21h
ret
read_from_keyboard endp
replace_a proc
mov si, offset msg + 2 ; move to register si offset of msg's
; data (we do not need first 2 bytes)
mov al, [si] ; move current (first) symbol from pointer si
;to register al
met:
cmp al, 'a' ; compare current symbol with 'a'
jne skip ; if current symbol is not equal to 'a' then
; go to skip label
mov al, 'A'
mov [si], al ; change current symbol to 'A'
skip:
inc si ; go to the next symbol
mov al, [si] ; move current symbol from pointer si
;to register al
cmp al, '$' ; compare current symbol with '$'
jne met ;if current symbol is not equal to '$' then
;go to met label
ret
replace_a endp
print_error proc
;write error
mov ah, 09h
lea dx, error_msg
int 21h
ret
print_error endp
handle_file proc
;create file
mov ah, 3ch
xor cx, cx ; cx = 0
lea dx, file_name
int 21h
jc error_file ;check if error occured
mov handler, ax
;write to file
mov ah, 40h
mov bx, handler
xor cx, cx ; cx = 0
mov cl, [msg_size] ; number of bytes to write
lea dx, msg + 2
int 21h
jc error_file ;check if error occured
mov msg + 1, 0ah; change second byte to new line symbol
call replace_a
;write to file
mov ah, 40h
mov bx, handler
xor cx, cx ; cx = 0
mov cl, [msg_size] ; number of bytes to write
inc cl
lea dx, msg + 1
int 21h
jc error_file ;check if error occured
cmp ax, cx
jne error_file ;check if string is completely written to file
;close file
mov ah, 3Eh
mov bx, handler
int 21h
jc error_file ;check if error occured
ret
error_file:
call print_error
ret
handle_file endp
start:
mov ax, ax
mov bx, data
mov ds, bx
;read string from keybord
call read_from_keyboard
;get msg size
lea si, msg + 1
mov al, [si]
mov msg_size, al
; first 2 bytes of msg is max length and length,
; we do not need this data anymore
; change second byte to new line symbol and
; don't use first byte
;write result to file
call handle_file
mov ah, 4ch
int 21h
code ends
end startРешение задачи: «Удаление конкретных символов из строки, запись результатов в файл»
textual
Листинг программы
LOCALS .model small .stack 100h .data FileName db 80, 0, 81 dup(?) String db 255, 0, 256 dup(?) Handle dw ? msgGetFileName db 'File name: ', '$' msgGetString db 'String: ', '$' CrLf db 0Dh, 0Ah, '$' errFileOpen db 'File open error', '$' .code main proc mov ax, @data mov ds, ax ;ввод имени файла mov ah, 09h lea dx, msgGetFileName int 21h mov ah, 0Ah lea dx, FileName int 21h mov ah, 09h lea dx, CrLf int 21h ;добавление 0 в конец строки lea si, FileName+2 mov al, FileName+1 mov ah, 0 add si, ax mov [si], byte ptr 0 ;ввод строки mov ah, 09h lea dx, msgGetString int 21h mov ah, 0Ah lea dx, String int 21h mov ah, 09h lea dx, CrLf int 21h ;открытие файла mov ah, 3Ch mov cx, 00h lea dx, FileName+2 int 21h jnc @@FileOpenOk mov ah, 09h lea dx, errFileOpen jmp @@Exit @@FileOpenOk: mov Handle, ax ;вывод исходной строки в файл mov ah, 40h lea dx, String+2 mov cl, String+1 mov ch, 0 mov bx, Handle int 21h ;вывод перевода строки в файл mov ah, 40h lea dx, CrLf mov cx, 2 mov bx, Handle int 21h ;преобразование строки lea si, String+1 call RemoveChar ;вывод обработанной строки в файл mov ah, 40h lea dx, String+2 mov cl, String+1 mov ch, 0 mov bx, Handle int 21h ;вывод перевода строки в файл mov ah, 40h lea dx, CrLf mov cx, 2 mov bx, Handle int 21h ;закрытие файла mov ah, 3Eh mov bx, Handle int 21h @@Exit: mov ax, 4C00h int 21h main endp RemoveChar proc push ax push bx push cx push dx push si push di mov cx, 0 ;текущая длина строки mov cl, [si] mov bx, si ;адрес ячейки с длиной строки mov dx, 0 ;новая длина строки inc si mov di, si @@For: mov al, [si] cmp al, ' ' je @@Skip mov [di], al inc di inc dx @@Skip: inc si loop @@For mov [bx], dl pop di pop si pop dx pop cx pop bx pop ax ret RemoveChar endp end main
Объяснение кода листинга программы
- Создаются локальные переменные
- Определение модели и размера стека
- Определение переменных данных:
FileName- хранит имя файлаString- хранит введенную строкуHandle- хранит обработанный файлmsgGetFileName- сообщение для ввода имени файлаmsgGetString- сообщение для ввода строкиCrLf- символ перевода строкиerrFileOpen- сообщение об ошибке открытия файла
- Начало процедуры main
- Ввод имени файла и строки
- Добавление символа завершения строки в
FileName - Открытие файла
- Вывод исходной строки в файл
- Вывод перевода строки в файл
- Преобразование строки с использованием процедуры
RemoveChar - Вывод обработанной строки в файл
- Вывод перевода строки в файл
- Закрытие файла
- Процедура завершения программы
- Процедура
RemoveCharдля удаления определенных символов из строки - Конец программы