Т. к. строка s "портится" в результате выполнения задачи,
надо не просто изменить пару строк - а вынести весь блок записи в файл до её изменения.
Т. е блок от "получения имени файла" до "нормальный выход" (не включая его) перенести до блока "изменение строки".
От себя замечу, что программку можно оптимизировать особенно функцию char2char (использовать lodsb(w)/stosb(w)) и в программе нет обработки ошибок при работе с файлом.
Примерно так:
;сегмент стека
stseg segment
stk db 256 dup (?)
stseg ends
;сегмент данных
data segment
mes1 db 'Vvedennay stroka:',0ah,0dh,'$'
mes2 db 0ah,0dh,'Izmenennay stroka:',0ah,0dh,'$'
mes3 db 0ah,0dh,'Vvedite file:',0ah,0dh,'$'
mes4 db 0ah,0dh,'File suschestvuet! Perezapisat? (y|n) $'
buf db 78
len db 00
s db 78 dup('$'),'$'
filebuf db 255
filelen db 00
filename db 255 dup('$'),'$'
data ends
;сегмент кода
code segment
assume CS:code, DS:data, SS:stseg
;процедура замены буквы d
;в DS:SI должна лежать обрабатываемая строка, оканчивающаяся символом $
char2char proc
push SI
push AX
mloop:
mov AL,byte ptr [SI]
cmp AL,'$'
je mend
cmp AL,'d'
jne mnext
mov byte ptr [SI],'7'
mnext:
inc SI
jmp mloop
mend:
pop AX
pop SI
ret
char2char endp
start:
xor AX,AX
mov BX,data
mov DS,BX
;ввод строки
mov AH,09h
lea DX,mes1
int 21h
mov AH,0ah
lea DX,buf
int 21h
;вывод исходной строки
mov AH,09h
lea DX,s
int 21h
;получение имени файла
askname:
mov AH,09h
lea DX,mes3
int 21h
mov AH,0ah
lea DX,filebuf
int 21h
;записываем \ вместо CR
lea AX,filename
add AL,filelen
mov BX,AX
mov [BX],byte ptr 0
;попытка создать файл
mov AH,5bh
lea DX,filename
mov CX,0000000b
int 21h
jnc workwithfile
;если уже существует, переспрашиваем пользователя
mov AH,09h
lea DX,mes4
int 21h
;ожидание ответа
mov AH,01h
int 21h
cmp AL,'y'
jne askname
;создаём принудительно
mov AH,3ch
lea DX,filename
mov CX,0000000b
int 21h
workwithfile:
;запись строки в файл
mov BX,AX
mov AH,40h
lea DX,s
xor CX,CX
mov CL,len
int 21h
;закрываем файл
mov AH,3eh
int 21h
;изменение строки
lea SI,s
call char2char
;вывод изменённой строки
mov AH,09h
lea DX,mes2
int 21h
mov AH,09h
lea DX,s
int 21h
;нормальный выход
mov AH,4ch
int 21h
code ends
end start
P.S:Ассемблера под рукой нет - это навскидку и что видно сразу. Если что-то неправильно (хотя всё должно быть ок) - пишите разберёмся.
Другие языки программирования и технологии
изменить прогу на ассемблере (всего лишь пару строк)
что бы было по вашему:
1) buf db 78 // это число 78 или тут должно бы 78 байт?
2) процедура char2char должна брать введеную строку копировать в третий буфер с изменением, что бы не искажать первоначальный ввод, введите временный буфер, куда буду складыватся результаты
1) buf db 78 // это число 78 или тут должно бы 78 байт?
2) процедура char2char должна брать введеную строку копировать в третий буфер с изменением, что бы не искажать первоначальный ввод, введите временный буфер, куда буду складыватся результаты
Изменяй. Разрешаю.
Похожие вопросы
- Ассемблер (TASM). Нужно ввести строку и с помощу команд обработки цепочек подсчитать кол-во русской буквы "в" в строке
- я должен написать прогу на ассемблере для перевода числа из восьмеричной системы в десятичную
- ассемблер, проверка длины строки
- Нужна помощь с программой на ассемблере - комментирование каждой строки
- помощь в выводе строк матрицы в ассемблере.
- ассемблер. задача. в строке определить позицию первого вхождения букве z
- Строки ассемблер нужно заполнить строку (10) рандомными символами. (MASM) как? помогите!
- Что может ассемблер?
- Почему многие программисты ненавидят ассемблер?Ведь у него куча плюсов!Он позволяет максимально задействовать
- Прошу помощи добить файловый in-out для готовой проги. Ассемблер
mov AH,0ah
lea DX,buf
int 21h
Формат buf при этом должен быть такой
0 байт - размер буфера
1 байт - заполняется функцией - реальная длина введённой строки
остальное - собственно введённая строка