Новичок
Джуниор
Регистрация: 16.03.2017
Сообщений: 1
|
Asm Доработать лабораторную работу
Программа должна выполнять поиск заданной последовательности символов в заданном файле, менять ее на другую заданную последовательность (того же размера) и измененный текст вводить в другой файл. Моя программа работает только для небольших файлов, так как считывает буфером только один раз и ищет в нем. Необходимо чтобы программа работала и для больших файлов, то есть считывала текст в цикле. Ни как не получается добавить цикл, прошу помогите!
Код:
code_seg segment
assume cs:code_seg, ds:code_seg
.386
org 100h
start:
FileNamePrint:
mov ah,09h
mov dx,offset msg1
int 21h
mov AH, 0Ah
mov DX, offset FileName
int 21h
xor BH, BH
mov BL, FileName[1]
mov FileName[BX+2], 0
lea dx, ent ;Перенос каретки
mov ah, 9
int 21h
OpenFile:
mov ax, 3D02h
mov dx, offset filename + 2
int 21h
jc OpenError
mov handle, ax
mov ah,09h
mov dx,offset msg4
int 21h
lea dx, ent ;Перенос каретки
mov ah, 9
int 21h
InputOne: ;Ввод первой строки
mov ah,09h
mov dx, offset msg2
int 21h
mov ah,0ah
mov dx, offset string
int 21h
lea dx, ent ;Перенос каретки
mov ah, 9
int 21h
InputTwo: ; строка на которую заменять
mov ah,09h
mov dx, offset msg3
int 21h
mov ah,0ah
mov dx, offset newstr
int 21h
lea dx, ent ;Перенос каретки
mov ah, 9
int 21h
ReadFromFile:
mov ah,3fh
lea dx,buffer
mov bx,handle
mov cx,60000
int 21h
jc Error_Read
lea di,buffer
Inspection: ;сравнение строк
mov cx,60000
mov al,string + 2
repne scasb ;Сравнить байт по адресу ESE)DI с AL(пока !=)
je Found ;Условие перехода:ZF=1
jmp Failed
Found: ;замена подстроки если нашлось
push ax
mov al, string + 1
dec di
lea si,string + 2
mov cx, ax
repe cmpsb
pushf ; значения флагов в стек
dec di
popf
jne Inspection
mov cx, ax
sub di,cx
inc di
lea si,newstr + 2
rep movsb ;Переслать байт из строки в строку
pop ax
FileName2Print:
mov ah,09h
mov dx,offset msg7
int 21h
mov AH, 0Ah
mov DX, offset FileName2
int 21h
xor BH, BH
mov BL, FileName2[1]
mov FileName2[BX+2], 0
lea dx, ent ;Перенос каретки
mov ah, 9
int 21h
OpenFile2:
mov ax, 3D02h
mov dx, offset filename2 + 2
int 21h
jc OpenError
mov handle2, ax
mov ah,09h
mov dx,offset msg4
int 21h
lea dx, ent ;Перенос каретки
mov ah, 9
int 21h
File2Pointer:
; DOS Fn 42H: установить указатель файла -- LSEEK.
; output: AX = код ошибки если CF установлен.
; DX:AX = новая позиция указателя файла.
mov cx,0
mov dx,0 ; CXX = на сколько передвинуть указатель: (CX * 65536) + DX
mov bx,handle2 ; BX = описатель файла.
mov ax,4200h ; AL = 0 переместить к началу файла + CXX.
int 21h
WriteToFile2:
mov ah,40h
lea dx,buffer
mov bx,handle2
mov cx, 60000
int 21h
jmp CloseFile2
;------------------Errors--------------------;
OpenError:
mov ah,09h
lea dx,error_msg1
int 21h
jmp Exit
Failed:
mov ah,09h
lea dx,msg5
int 21h
jmp CloseFile
Error_Read:
mov ah,09h
lea dx,error_msg2
int 21h
jmp CloseFile
CloseFile:
mov ah,3Eh
mov bx,handle
int 21h
CloseFile2:
mov ah,3Eh
mov bx,handle2
int 21h
Exit:
mov ah, 1
int 21h
mov ax,4c00h
int 21h
;------------------Data---------------------;
FileName DB 14,0,14 dup (0)
FileName2 DB 14,0,14 dup (0)
msg1 db 'Enter FileName $'
msg2 db 'Enter word you want to replace: $'
msg3 db 'Enter second word: $'
msg4 db 'File was open.$'
msg5 db 'Not found$'
msg7 db 'Enter FileName to write $'
;msg db 'Word found$'
error_msg1 db 'File wasnt open.$'
error_msg2 db 'Cant read from file.$'
buffer db 60010 dup (?)
string db 200 dup ('$')
newstr db 200 dup ('$')
strlen db ?
handle dw 0
handle2 dw 0
ent db 10, 13, '$'
ret
code_seg ends
end start
Вот так пытался сделать цикл:
Код:
code_seg segment
assume cs:code_seg, ds:code_seg
.386
org 100h
start:
FileNamePrint:
mov ah,09h
mov dx,offset msg1
int 21h
mov AH, 0Ah
mov DX, offset FileName
int 21h
xor BH, BH
mov BL, FileName[1]
mov FileName[BX+2], 0
lea dx, ent ;Перенос каретки
mov ah, 9
int 21h
OpenFile:
mov ax, 3D02h
mov dx, offset filename + 2
int 21h
jc OpenError
mov handle, ax
mov ah,09h
mov dx,offset msg4
int 21h
lea dx, ent ;Перенос каретки
mov ah, 9
int 21h
InputOne:
mov ah,09h
mov dx, offset msg2
int 21h
mov ah,0ah
mov dx, offset string
int 21h
lea dx, ent ;Перенос каретки
mov ah, 9
int 21h
InputTwo:
mov ah,09h
mov dx, offset msg3
int 21h
mov ah,0ah
mov dx, offset newstr
int 21h
lea dx, ent ;Перенос каретки
mov ah, 9
int 21h
FileName2Print:
mov ah,09h
mov dx,offset msg7
int 21h
mov AH, 0Ah
mov DX, offset FileName2
int 21h
xor BH, BH
mov BL, FileName2[1]
mov FileName2[BX+2], 0
lea dx, ent ;Перенос каретки
mov ah, 9
int 21h
OpenFile2:
mov ax, 3D02h
mov dx, offset filename2 + 2
int 21h
jc OpenError
mov handle2, ax
mov ah,09h
mov dx,offset msg4
int 21h
lea dx, ent ;Перенос каретки
mov ah, 9
int 21h
File2Pointer:
mov cx,0
mov dx,0 ; CXX = на сколько передвинуть указатель: (CX * 65536) + DX
mov bx,handle2 ; BX = описатель файла.
mov ax,4200h ; AL = 0 переместить к началу файла + CXX.
int 21h
FilePointer:
mov cx,0
mov dx,0 ; CXX = на сколько передвинуть указатель: (CX * 65536) + DX
mov bx,handle ; BX = описатель файла.
mov ax,4200h ; AL = 0 переместить к началу файла + CXX.
int 21h
metka:
mov ah,09h
mov dx,offset msg10
int 21h
ReadFromFile:
mov ah,3fh
lea dx,buffer
mov bx,handle
mov cx,10
int 21h
jc Error_Read
push ax
lea di,buffer
Inspection:
mov cx,10
mov al,string + 2
repne scasb ;Сравнить байт по адресу ESE)DI с AL(пока !=)
je Found ;Условие перехода:ZF=1
jmp WriteToFile2
Found:
mov ah,09h
mov dx,offset msg11
int 21h
mov al, string + 1
dec di
lea si,string + 2
mov cx, ax
repe cmpsb
pushf ; значения флагов в стек
dec di
popf
jne Inspection
mov cx, ax
sub di,cx
inc di
lea si,newstr + 2
rep movsb ;Переслать байт из строки в строку
WriteToFile2:
mov ah,40h
lea dx,buffer
mov bx,handle2
mov cx, 10
int 21h
mov ah,09h
mov dx,offset msg13
int 21h
Looper:
;mov cx, 1
pop ax
cmp ax, 0
jne metka
;loop metka
mov ah,09h
mov dx,offset msg12
int 21h
jmp CloseFile2
;------------------Errors--------------------;
OpenError:
mov ah,09h
lea dx,error_msg1
int 21h
jmp Exit
Failed:
mov ah,09h
lea dx,msg5
int 21h
jmp CloseFile
Error_Read:
mov ah,09h
lea dx,error_msg2
int 21h
jmp CloseFile
CloseFile:
mov ah,3Eh
mov bx,handle
int 21h
jmp Exit
CloseFile2:
mov ah,3Eh
mov bx,handle2
int 21h
jmp CloseFile
Exit:
mov ah, 1
int 21h
mov ax,4c00h
int 21h
;------------------Data---------------------;
FileName DB 14,0,14 dup (0)
FileName2 DB 14,0,14 dup (0)
msg1 db 'Enter FileName $'
msg2 db 'Enter word you want to replace: $'
msg3 db 'Enter second word: $'
msg4 db 'File was open.$'
msg5 db 'Not found$'
msg7 db 'Enter FileName to write $'
;msg db 'Word found$'
msg10 db ' cycle $'
msg11 db ' found $'
msg12 db ' vyhod $'
msg13 db ' write $'
error_msg1 db 'File wasnt open.$'
error_msg2 db 'Cant read from file.$'
buffer db 11 dup (?)
string db 200 dup ('$')
newstr db 200 dup ('$')
strlen db ?
handle dw 0
handle2 dw 0
ent db 10, 13, '$'
ret
code_seg ends
end start
Последний раз редактировалось Аватар; 16.03.2017 в 13:23.
|