Удаление конкретных символов из строки, запись результатов в файл - 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

Объяснение кода листинга программы

  1. Создаются локальные переменные
  2. Определение модели и размера стека
  3. Определение переменных данных:
    • FileName - хранит имя файла
    • String - хранит введенную строку
    • Handle - хранит обработанный файл
    • msgGetFileName - сообщение для ввода имени файла
    • msgGetString - сообщение для ввода строки
    • CrLf - символ перевода строки
    • errFileOpen - сообщение об ошибке открытия файла
  4. Начало процедуры main
  5. Ввод имени файла и строки
  6. Добавление символа завершения строки в FileName
  7. Открытие файла
  8. Вывод исходной строки в файл
  9. Вывод перевода строки в файл
  10. Преобразование строки с использованием процедуры RemoveChar
  11. Вывод обработанной строки в файл
  12. Вывод перевода строки в файл
  13. Закрытие файла
  14. Процедура завершения программы
  15. Процедура RemoveChar для удаления определенных символов из строки
  16. Конец программы

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы