Регистрация: 14.02.2011
Сообщений: 4
|
Работа с функцией scasb
Всем привет!
Написал программу, которая "читает" текст из файла. Пользователь вводит кол-во букв (сейчас внимание!  ), а программа должна определить кол-во слов, кол-во букв в которых больше, чем значение переменной пользователя. Функция по поиску рабочая (проверял на ввод\вывод в консоле). Алгоритм следующий: читаю 1024 байта + 2 (0Dh+0Ah) - размер полной строки в текстовом файле, копирую их в промежуточный буфер (как поток), передаю его в функцию scanstr, которая делит её на подстроки, а потом каждую подстроку копирую из буфера во второй буфер (строка) для подстрок ф-циейcpysubstr, который обрабатывается ф-цией поиска слов, после чего выводится результат в файл. Так до конца исходного файла с текстом.
Проблема на данный момент заключается в том, что scanstr работает некорректно, а именно, делает остановку на 0Ah или 0Dh, находящихся в al.
Привожу полный код:
Код:
data segment 'data'
inpnum db 'Input count (N < count of letters in words):$'
sucoutstr db 13,10,'String writing in RESULT.TXT is done!$'
sucinstr db 13,10,'String reading from file STRING.TXT was succesful!$'
next db 0Dh,0Ah,'$'
prindx dw 0
prindxM dw 0
prindxMcur dw 0
str db 1026 dup(?) ;длина строки + 0Dh/0Ah
str_len dw ?
strin db 1026 dup(?)
strin_len dw ?
str_maxlen equ 1024
stRes db ' ',?,0Dh,0Ah
CNT_L dw ? ; пользовательская переменная
RES db ? ; кол-во слов
;REC_LEN db 32 ;длина имени + 0Dh/0Ah
FRPATH db 'C:\STRING.TXT',00h
FILERHAND dw ?; хэндлер(дескриптор) файла для чтения из него
FWPATH db 'C:\RESULT.TXT',00h
FILEWHAND dw ? ;хэндлер(дескриптор) файла для записи в него
data ends
code segment 'code'
assume cs:code, ds:data
start:
mov ax, data
mov ds, ax
lea dx, inpnum
call outstr
mov ah, 1
int 21h
sub al, '0'
mov byte ptr CNT_L, al
call fcreate
cmp ENDCODE,00
jnz closefs
call fopen
cmp ENDCODE,00
jnz progend
getstr:
mov STRENDCODE, 00
call fread
cmp ENDCODE,00
jnz closefs
lea dx, sucinstr
call outstr
lea dx, next
call outstr
;------------------------------обработка строки--------------------------
getsubstr:
call scanstr
call cpysubstr
lea dx, strin
mov cx, strin_len
call fwrite
;-------------------------------поиск слов-------------------------------
call findLtrCt
;-------------------------------запись подстроки в файл------------------
mov bp, 1
mov al, RES
mov stRes[bp], al
lea dx, stRes
mov cx, 4
call fwrite
lea dx, sucoutstr
call outstr
lea dx, next
call outstr
;-------------------------------проверка: конец файла/строки--------------
cmp FENDCODE, 00
jne closefs
cmp STRENDCODE, 00
jne getstr
jmp getsubstr
closefs:
call fclose
progend:
mov ah, 01h
int 21h ; отклик пользователя
mov ah, 4Ch
int 21h
;-------------------------------procedures--------------------------------
findLtrCt proc near
mov si, 0; индекс первого элемента строки
mov dl, 0; кол-во слов
mov bx, 0;счётчик букв
mov cx, strin_len; кол-во введённых элементов строки
beg:
cmp str[si], 20h
jne sym
cmp bx, 0
je nextsm
jmp short check
sym:
inc bx
nextsm:
inc si
cmp str[si], 1Ah ;признак конца файла
jne l3
mov FENDCODE, 01
l3:
loop beg
check:
cmp CNT_L, bx
mov bx, 0
jl incres
cmp cx, 0
jne nextsm
jmp l2
incres:
inc dl
cmp cx, 0
jne nextsm
l2:
mov RES, dl
ret
findLtrCt endp
outstr proc near
mov ah, 9
int 21h
ret
outstr endp
fopen proc near
fopen endp
fread proc near
mov ah, 3Fh
mov bx, FILERHAND
mov cx, str_maxlen
lea dx, str
int 21h
jc rf1
cmp ax,00;конец файла
je rf2
mov str_len, ax
jmp rf3
rf1:
lea dx, READMSG
call outstr
rf2:
mov ENDCODE, 01
rf3:
ret
fread endp
fcreate proc near
fclose endp
scanstr proc near
mov ax, prindxM
sub str_len, ax ; уменьшаем размер строки на уже пройдённый "путь"
mov cx, str_len
mov bp, prindxM
cld ;DF = 0, слева направо
mov al, 0Ah
lea di, str[bp]
repne scasb
jnz notfound
dec prindx ; извлекаем LF (0Ah)
;------------ сохраняем индекс для следующих обраб-к--------------
notfound:
mov ax, str_len
mov prindx, ax ; prindx - кол-во обработанных символов в подстроке str(используется в ф-ции writestr)
sub prindx, cx ; cx - кол-во обработанных символов из текущей str_len
mov ax, prindxM
mov prindxMcur, ax ; сохраняем начало подстроки str (используется в ф-ции writestr)
mov ax, prindx
add prindxM, ax ; позиция для str
;-----------------------------------------------------------------
cmp prindx, str_maxlen
jb s1
mov STRENDCODE, 01 ; достигнут конец str
mov prindxM, 0
s1:
ret
scanstr endp
cpysubstr proc near
mov bp, prindxMcur
mov ax, prindx
mov strin_len, ax
cld
mov cx, prindx
lea di, strin
lea si, str[bp]
rep movsb
ret
cpysubstr endp
code ends
end start
Последний раз редактировалось alexsvk; 22.03.2011 в 18:00.
Причина: Из-за длинного кода удалил ф-и open,create и пер-е - строки об ошибках
|