Страница 1 из 1

Ассемблер; удалить слова из текста

Добавлено: 31 май 2009, 08:32
Lili
Безумно срочно нужна помощь!!!...необходимо написать программу по удалению слова из всех строк текста предшествующее слову, содержащему заданный набор букв...текст находится в буфере...после удаления надо записать все в файл...часть задания уже сделана...вторую часть никак не осилить!помогите пожалуйста)


masm

Код: Выделить всё

LengthBuffer EQU 128
LengthString EQU 16
True EQU 1
False EQU 0

.model small
.stack 1024
.data

MsgFileLoading db 'Enter file name:',0Dh,0Ah,'$' ;0Dh,0Ah - perevod stroki
MsgFileSaving db 0Dh,0Ah,'Save file as:',0Dh,0Ah,'$'
MsgSimbolSearch db 'Search chars:',0Dh,0Ah,'$'
MsgError db 'Error!',0Dh,0Ah,'$'
bufferList label byte
maxLen db 80
actLen db ?
bufferKeyboard db 80 dup(' ')

fileRead dw 0
fileWrite dw 0
PtrInFileRead dd 0
PtrInFileWrite dd 0

SearchChar db 't', 15 dup(0)
SearchCharCopy db 16 dup(?)

ReadBuffer db LengthBuffer dup(?)
WriteBuffer db LengthBuffer dup(?)
PtrReadBuf dw 0
PtrWriteBuf dw 0

LenReadBuf dw 0
LenWriteBuf dw 0

StartWord dd 0
EndWord dd 0
StartPreWord dd 0
EndPreWord dd 0
EnterWord db 0
EnterPreWord db 0

.code
DellWord proc near

ret
DellWord endp

ShiftFilePtr proc near
push bx
push dx
mov bx , word ptr PtrInFileRead
mov dx , word ptr PtrInFileRead + 2
add bx , LenReadBuf
adc dx , 0 ;Если был перенос
mov word ptr PtrInFileRead , bx
mov word ptr PtrInFileRead + 2 , dx
pop dx
pop bx
ret
ShiftFilePtr endp

InBuffer proc near
push ax
push bx
mov ax , LenReadBuf
mov bx , PtrReadBuf
cmp ax , bx
jne MNoRead
call ReadFileInBuffer
xor bx , bx
mov PtrReadBuf , bx
ret
MNoRead:
inc PtrReadBuf
pop bx
pop ax
ret
InBuffer endp

NoChar proc near
cmp al , 20h 
je MEndWord
cmp al , 0dh
je MEndWord
cmp al , 0ah
je MEndWord
cmp al , 09h
je MEndWord
cmp al , 21h
je MEndWord
cmp al , 28h
je MEndWord
cmp al , 29h
je MEndWord
cmp al , 3Fh
je MEndWord
call InBuffer
jmp MNextChar
MEndWord:
cmp EnterWord , False
je NoEnterWord
mov ax , word ptr PtrInFileRead ;Сохраняем указатель на конец слова
mov bx , PtrReadBuf
add ax , bx
mov word ptr EndWord , ax
mov ax , word ptr PtrInFileRead + 2
adc ax , 0
mov word ptr EndWord + 2 , ax
call InBuffer
NoEnterWord:
Call SaveStartWord
jmp MNextChar
ret
NoChar endp

ReadFileInBuffer proc near
push ax
push bx
push cx
push dx
mov ah , 3Fh
mov bx , fileRead ;дискриптор файла
mov cx , LengthBuffer ;размер буффера
lea dx , ReadBuffer ;начало буфера в памяти
int 21h
mov LenReadBuf , ax ;сохраняем длину получ информации
pop dx
pop cx
pop bx
pop ax
ret
ReadFileInBuffer endp

SaveStartWord proc near
push ax
push dx
push bx
mov EnterWord , True
mov ax , word ptr PtrInFileRead ;Сохраняем указатель на начало слова
mov bx , word ptr PtrInFileRead + 2
mov dx , PtrReadBuf
sub ax , LenReadBuf
sbb bx , 0
add ax , dx
adc bx , 0
mov word ptr StartWord , ax
mov word ptr StartWord + 2 , bx
pop bx
pop dx
pop ax
ret
SaveStartWord endp

SearchAndDell proc near
cld
lea si , SearchChar
lea di , SearchCharCopy
mov cx , LengthString 
rep movsb

MReadBuffer:
call ReadFileInBuffer
jc MErrorRead
cmp LenReadBuf , 0 ;прочиталось ли инфорация (кол-во байт)
je MReadZero
call ShiftFilePtr
MNextChar:
mov bx , PtrReadBuf
mov al , ReadBuffer[bx] ;Очередной символ из буффера
cld
lea di , SearchCharCopy
mov cx , LengthString
repne scasb ;Поиск символа в наборе
jz MBeChar
call NoChar
jmp MNextChar
MBeChar:
;Символ найден
;call BeChar
mov [di-1] , byte ptr 0
mov bl , EnterWord
cmp bl , True
je EnterWordE
call SaveStartWord
EnterWordE:

mov cx , 16
repne scasb
mov EnterWord , True ;Возможно не нужно
jz AllZero
cmp bx , LengthBuffer
call InBuffer
jmp MNextChar

AllZero:
call DellWord
cld
lea si , SearchChar
lea di , SearchCharCopy
mov cx , LengthString
rep movsb
jmp MNextChar
MErrorRead:
MReadZero:
EndReadE:
ret
SearchAndDell endp

main:
mov ax , @data
mov ds , ax
mov es , ax

nextTry:

mov ah , 0Ah ;ввод данных с клавиатуры
lea dx , bufferList
int 21h

mov bl , actLen ;выбор последнего+1 символа=0Dh в имени файла и его обнуление
xor bh , bh
mov bufferKeyboard[bx] , 0

mov ah , 3Dh ; чтение из файла
mov al , 2
lea dx , bufferKeyboard
int 21h
jnc noErrorRead
mov ah , 09
lea dx , MsgError
int 21h
jmp nextTry
noErrorRead:
mov fileRead , ax ;сохранение дескриптора(номера) откр файла

NextTryCreate:
mov ah , 0Ah ;ввод данных с клавиатуры
lea dx , bufferList
int 21h

mov bl , actLen 
xor bh , bh
mov bufferKeyboard[bx] , 0

mov ah , 3Ch ;создание файла
mov cx , 0
lea dx , bufferKeyboard
int 21h
jnc noErrorCreate
mov ah , 09
lea dx , MsgError
int 21h
jmp nextTryCreate
noErrorCreate:
mov fileWrite , ax

call SearchAndDell

mov ah , 3Eh ;закрытие файла
mov bx , fileRead
int 21h

mov ah , 3Eh
mov bx , fileWrite
int 21h

mov ax, 4c00h
int 21h
end main