Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление конкретных символов из строки, запись рез, Удаление конкретных символов из строки,  
:(
    Опции темы
sorokaup
Дата 1.6.2017, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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

PM MAIL   Вверх
Google
  Дата 24.10.2019, 04:35 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0683 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.