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