Заменить символы «с» на «е» - 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
Объяснение кода листинга программы
- Создаётся метка
start. - Загружается значение из регистра
axв регистрax. - Загружается значение из регистра
axв регистрax. - Загружается значение из регистра
axв регистрax. - Загружается значение из регистра
axв регистрax. - Загружается значение из регистра
axв регистрax. - Загружается значение из регистра
axв регистрax. - Загружается значение из регистра
axв регистрax. - Загружается значение из регистра
axв регистрax. - Загружается значение из регистра
axв регистрax. Как видно, данный код просто загружает значение из регистраaxв регистрaxнесколько раз.