Заменить символы «с» на «е» - 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
несколько раз.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д