Удаление конкретных символов из строки, запись результатов в файл - 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
для удаления определенных символов из строки - Конец программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д