Новичок
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 1.6.2017
Репутация: нет Всего: нет
|
Добрый день, присутствует такая проблема, условие задачи стоит так: Ввести с клавиатуры название файла, затем ввести строку, из которой необходимо удалить конкретный символ (в данном случае пробел) и записать результаты в файл с именем из первого ввода и содержанием в виде двух строк: 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 buf db 200,201 dup(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 ; ------------------------------------------------------------------------------------ ; ------------------------------------------------------------------------------------ ; Ïðîöåäóðà çàìåíû ñèìâîëà 'a' íà 'A'
replace_a proc mov si, offset msg + 2 ; Ïåðåìåùàåì ðåãèñòîð â si ñîäåðæèìîå msg (ïåðâûå 2 áèòà íå òðîãàåì) (move to register si offset of msg's data (we do not need first 2 bytes)) mov al, [si] ; Ïåðåìåùàåì òåêóùèé (ïåðâûé) ñèìâîë èç òî÷êè si â ðåãèñòð al (move current (first) symbol from pointer si to register al)
met: cmp al, 'a' ; Ñðàâíèâàåì òåêóùèé ñèìâîë ñ ñèìâîëîì "à" jne skip ; Åñëè òåêóùèé ñèìâîë íå ðàâåí "à", òî ïðîïóñêàåì ìåòêó mov al, 'A' ; Åñëè òåêóùèé ñèìâîë ðàâåí "à", òî ïðîèçâîäèì çàìåíó ñèìâîëà íà "À" mov [si], al ; Èçìåíÿåì òî÷êó si íà íîâûé ñèìâîë skip: inc si ; Ïåðåõîäèì ê ñëåäóþùåìó ñèìâîëó mov al, [si] ; Ïåðåìåùàåì òåêóùèé ñèìâîë èç òî÷êè si â ðåãèñòð al cmp al, '$' ; Ñðàâíèâàåì òåêóùèé ñèìâîë ñ ñèìâîëîì "$" jne met ; Åñëè òåêóùèé ñèìâîë íå ðàâåí "$", òî ïðîïóñêàåì ìåòêó è âîçâðàùàåìñÿ ê öèêëó met ret ; Åñëè òåêóùèé ñèìâîë ðàâåí "$", òî çàêàí÷èâàåì ïðîöåäóðó replace_a endp
; ------------------------------------------------------------------------------------ ; ------------------------------------------------------------------------------------
; --------------------------------------------- ; Ïðîöåäóðà âûâîäà íà ýêðàí ñîîáùåíèÿ ñ îøèáêîé
print_error proc mov ah, 09h lea dx, error_msg int 21h ret print_error endp
; --------------------------------------------- ; Ïðîöåäóðà ñîçäàíèÿ è çàïèñè â ôàéë
handle_file proc mov ah, 3ch ; Ñîçäàíèå ôàéëà xor cx, cx ; cx = 0 lea dx, file_name ; Ñîçäàåì ôàéë ñ íàçâàíèåì â ïåðåìåííîé file_name int 21h ; Ïðåðûâàíèå jc error_file ; Ïðîâåðêà ôàéëà íà îøèáêè
mov handler, ax
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 ; Ïðîâåðêà ôàéëà íà îøèáêè mov msg + 1, 0ah ; Èçìåíÿåì âòîðîé áàéò íà ñèìâîë íîâîé ñòðîêè (change second byte to new line symbol) call replace_a ; Âûçûâàåì ïðîöåäóðó çàìåíû ñèìâîëà "à" íà "À" 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 ; Ïðîâåðêà ôàéëà íà îøèáêè cmp ax, cx jne error_file ; Ïðîâåðêà çàïèñè ñòðîêè â ôàéë (check if string is completely written to file) mov ah, 3Eh ; Çàêðûòèå ôàéëà mov bx, handler int 21h
jc error_file ; Ïðîâåðêà ôàéëà íà îøèáêè ret ; Çàâåðøàåì ðàáîòó ïðîãðàììû
; --------------------------------------------- ; Ôóíêöèÿ âûâîäà ñîîáùåíèÿ îá îøèáêå ðàáîòû ñ ôàéëîì
error_file: call print_error ret handle_file endp
; ------------------------------------------------------------------------------------ ; ------------------------------------------------------------------------------------ ; ------------------------------------------------------------------------------------ ; ÇÀÏÓÑÊ ÏÐÎÃÐÀÌÌÛ
start: mov ax, ax mov bx, data mov ds, bx call read_from_keyboard ; ×èòàåì ñòðîêó ñ êëàâèàòóðû lea si, msg + 1 ; Ïîëó÷àåì ðàçìåð ñîîáùåíèÿ (msg size) mov al, [si] mov msg_size, al
; Ïåðâûå 2 bytes ñîîáùåíèÿ msg ýòî ìàêñèìàëüíàÿ äëèíà (max length) è äëèíà (length), ; Ìû íå íóæäàåìñÿ â ýòèõ äàííûõ (we do not need this data anymore) ; Èçìåíåíèå âòîðîãî áàéòà ñ ñèìâîëà íîâîé ñòðîêè (change second byte to new line symbol and) ; è íå èñïîëüçóéòå ïåðâûé áàéò
call handle_file ; çàïèñü ðåçóëüòàòîâ â ôàéë mov ah, 4ch int 21h code ends end start
|
|