Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2017, 13:20   #1
BlackHorror
Новичок
Джуниор
 
Регистрация: 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.
BlackHorror вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать лабораторную работу Homakk Общие вопросы C/C++ 1 09.10.2012 23:36
Сделать лабораторную работу Homakk Помощь студентам 1 08.10.2012 22:46
Пoмогитe решить лабораторную работу izoalex Паскаль, Turbo Pascal, PascalABC.NET 0 26.12.2011 20:45
Пoмогитe решить лабораторную работу izoalex Паскаль, Turbo Pascal, PascalABC.NET 5 30.11.2011 22:59
Написать лабораторную работу на ассемблере iwaniwan Фриланс 1 16.04.2009 06:46