Заменить символы «с» на «е» - Assembler

Узнай цену своей работы

Формулировка задачи:

Товарищи! HELP! Разработать программу вывода строковых данных в файл. Строка вводится с клавиатуры, во введенной строке выполнить замену символов, и вывести результирующую строку в файл. Так вот запускаю, а программа выдаёт "Error! Could not handle file $" если файл существует пустой, или если файла нет вообще то и ничего не записывает. в чём проблема? и что нужно исправить?
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_5 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, 'c' ; compare current symbol with 'c'
    jne skip ; if current symbol is not equal to 'c' then 
    ; go to skip label
    mov al, 'e'
    mov [si], al ; change current symbol to 'e'
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_5 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
    
    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
    mov msg + 1, 0ah; change second byte to new line symbol 
    
    call replace_5
    
    ;write result to file
    call handle_file
    
    mov ah, 4ch
    int 21h
code ends
end start

Решение задачи: «Заменить символы «с» на «е»»

textual
Листинг программы
start:
mov ax,ax
mov ax,ax
mov ax,ax
mov ax,ax
mov ax,ax
mov ax,ax
mov ax,ax
mov ax,ax
mov ax,ax

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

  1. Создаётся метка start.
  2. Загружается значение из регистра ax в регистр ax.
  3. Загружается значение из регистра ax в регистр ax.
  4. Загружается значение из регистра ax в регистр ax.
  5. Загружается значение из регистра ax в регистр ax.
  6. Загружается значение из регистра ax в регистр ax.
  7. Загружается значение из регистра ax в регистр ax.
  8. Загружается значение из регистра ax в регистр ax.
  9. Загружается значение из регистра ax в регистр ax.
  10. Загружается значение из регистра ax в регистр ax. Как видно, данный код просто загружает значение из регистра ax в регистр ax несколько раз.

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

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