Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

Вернуться   Форум программистов > Низкоуровневое программирование > 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


22:08.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


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