Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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

Ответ
 
Опции темы
Старый 22.03.2011, 18:56   #1
alexsvk
 
Регистрация: 14.02.2011
Сообщений: 4
Репутация: 10
По умолчанию Работа с функцией 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 в 19:00. Причина: Из-за длинного кода удалил ф-и open,create и пер-е - строки об ошибках
alexsvk вне форума   Ответить с цитированием
Старый 20.11.2012, 03:42   #2
7rubin
Пользователь
 
Регистрация: 18.12.2011
Сообщений: 25
Репутация: 23
По умолчанию Удалить из строки все слова длиннее пяти

Извини за беспокойство. У тебя похожая тема, может сможешь написать мне прогу.
Удалить из строки(строка вводится с клавиатуры) все слова длиннее пяти символов без использования дополнительной памяти.
Спасибо.
7rubin вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с функцией IIF Обсидиан Microsoft Office Access 3 13.10.2010 08:59
Работа с функцией (С) ordoss Помощь студентам 8 03.01.2010 20:02
Работа с функцией islower() Greynvi4 Общие вопросы C/C++ 3 07.08.2009 21:37
[Assembler]: Размер каталогов и работа с функцией "copy" Roverka Помощь студентам 4 27.11.2008 21:13


01:05.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru