Другие языки программирования и технологии

изменить прогу на ассемблере (всего лишь пару строк)

XK
Xu4Y Kak Marik
1 387
Т. к. строка 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:Ассемблера под рукой нет - это навскидку и что видно сразу. Если что-то неправильно (хотя всё должно быть ок) - пишите разберёмся.
Грей Кристина
Грей Кристина
84 764
Лучший ответ
что бы было по вашему:
1) buf db 78 // это число 78 или тут должно бы 78 байт?
2) процедура char2char должна брать введеную строку копировать в третий буфер с изменением, что бы не искажать первоначальный ввод, введите временный буфер, куда буду складыватся результаты
Сергей Словцов
Сергей Словцов
94 799
Андрей Богданов Это для ввода DOS строки
mov AH,0ah
lea DX,buf
int 21h

Формат buf при этом должен быть такой
0 байт - размер буфера
1 байт - заполняется функцией - реальная длина введённой строки
остальное - собственно введённая строка
Изменяй. Разрешаю.