Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.16.66.206] |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Фигня имхо. Я бы, упрись мне скорость, скорее думал бы в направлении сравнения словами.
|
Сообщ.
#17
,
|
|
|
REPE SCASB замечательно найдет пробел, а значит и предыдущий символ. Скорость данной конструкции превосходная.
|
Сообщ.
#18
,
|
|
|
Akina Согласен, но посколько у заказчика сего не было обозначено четких требований к формату входных данных, слепил как говорится из того, что было На досуге для себя может допилю таки. Хотя таких ископаемых динозавров как тасм давно пора оставить палеонтологам
Добавлено mov dx,@data mov ds,dx push ds pop es Ну дык стек надо подергать, че ему прохлажаться то?! Хотя если серьезно разбираю демо-примеры FASM DOS Гриштара я задавался тем же вопросом. Что это за стиль инициализировать сегмент данных через стек?! |
Сообщ.
#19
,
|
|
|
Цитата APleskan @ У меня в книжке "Программируем на языке ассемблера IBM PC" дословно эти строки так описаны:Что это за стиль инициализировать сегмент данных через стек?! Цитата В нашей программе эти строки не имеют практического смысла, но вообще здесь продемонстрирован удобный приём переноса содержимого одного сегментного регистра в другой. |
Сообщ.
#20
,
|
|
|
Цитата APleskan @ Что это за стиль инициализировать сегмент данных через стек?! Компактности ради - PUSH/POP однобайтные. Хотя по скорости копированию из РОН проигрывают. |
Сообщ.
#21
,
|
|
|
А там не случится, что современные ЦП увидят подряд push/pop и всё внутрях перенесут почти столь же быстро аки и из РОНа?
|
Сообщ.
#22
,
|
|
|
Akina, ясно понятно
|
Сообщ.
#23
,
|
|
|
Akina, т.е. по поводу второго, указанного Вами, недостатка нужно, например, сравнивать посимвольно на предмет совпадения каждый символ искомой подстроки с исходной строкой с 1-го символа исходной строки до ее конца, со второго до конца исходной строки и т.д.?
Конечно, получается совсем неэффективно с точки зрения алгоритма, но пока ничего другого в голову не пришло. Или есть лучшее решение? |
Сообщ.
#24
,
|
|
|
Цитата APleskan @ Или есть лучшее решение? Поиск слова в строке - двухэтапный. Сначала ищется первый символ, а при нахождении его - сравнивается посимвольно всё слово. Так вот - если второй этап неудачен, дальнейший скан по первому этапу следует проводить не с той точки. где закончился неудачный последний второй этап, а с той, где закончился последний первый этап. Т.е. указателей - два. И процедур соответственно две - первая ищет в одной строке заданный символ, вторая, вызываемая из первой, сравнивает два слова. И она же, если обнаружено совпадение, выполняет вывод. |
Сообщ.
#25
,
|
|
|
Понял. Но все равно, мы же не возвращаемся назад при сравнении? Просматриваем строку слева направо из начала в конец (до нуль-терминатора)
Добавлено Akina Бойер-Мур таки, вот это извращение ;--------------------------------------------------------------------------------; ;Вход: S и P - массивы символов размером N и M байт (M=<N). ;Выход: сообщение о количестве вхождений строки P в строку S. ;--------------------------------------------------------------------------------; masm model small .data mes db 0dh,0ah,"Вхождений строки - " ;задаем массив P - аргумент поиска p db "abac" Len_P=$-p ;M=Len_P db " - в строку - " ;задаем массив S s db "ababac" Len_S=$-s ;N=Len_S db " - " Count db 0 ;счетчик вхождений P в S Db " раз(а)$" d db 255 dup (0) ;вспомогательный массив k db 0 .stack 256 .code main: mov dx,@data mov ds,dx push ds pop es ;этап 1 - заполнение массива D ;заполняем элементы массива d значением M - размером образца для поиска mov cx,255 ;размер кодовой таблицы ASCII mov al,len_p lea di,d rep stosb ;цикл просмотра образца и замещение некоторых элементов d значениями смещений ;ДЛЯ j=0 ДО M-2 ДЕЛАТЬ ;НАЧ_БЛОК_1 ;d[p[j]]:=M-j-1 ;КОН_БЛОК_1 xor si,si ;j:=0 cycl1: cmp si,len_p-1 jge e_cycl1 mov al,p[si] mov di,ax mov bl,len_p dec bl sub bx,si mov d[di],bl inc si jmp cycl1 e_cycl1: ;//этап 2: поиск ;i:=M mov di,len_p ;I:=M ;ПОВТОРИТЬ ;j:=M; k:=i ;цикл пока (j>=0)ИЛИ(I<n) cycl2: mov si,len_p ;j:=M mov bx,di ;k:=I ;ПОВТОРИТЬ ;K:=k-1;j:=j-1 ;ПОКА (j>=0)ИЛИ(p[j]==s[k]) ;цикл пока (j>=0)ИЛИ(p[j]==p[k]) cycl3: dec bx ;k:=k-1 dec si ;j:=j-1 ;цикл пока (j>=0)ИЛИ(p[j]==p[k]) cmp si,0 jl m2 mov al,p[si] cmp s[bx],al jne m2 jmp cycl3 m2: ;i:=i+d[s[i-1]] push di dec di mov al,s[di] mov di,ax mov al,d[di] pop di add di,ax ;I:=I+d[s[I-1]] ;ПОКА (j>=0)ИЛИ(i<N) ;цикл пока (j>=0)ИЛИ(I<n) cmp si,0 jl m1 cmp di,len_s jg exit_f jmp cycl2 ;ЕСЛИ j<0 ТО вывод сообщения об удаче поиска ;ИНАЧЕ вывод сообщения о неудаче поиска m1: ;вывод сообщения о результатах поиска inc count jmp cycl2 exit_f: add count,30h lea dx,mes mov ah,09h int 21h exit: ;КОН_ПРОГ ;выход mov ax,4c00h int 21h end main Почти все уже |
Сообщ.
#26
,
|
|
|
APleskan, вроде нужно было вывести одинаковые слова в двух строках, а не кол-во вхождений одной строки в другую... нет?
|
Сообщ.
#27
,
|
|
|
Поскольку в методичке у заказчика строгой формулировки размера входных данных не было, то я пошел на это жульничество
Там задача была поставлена так: взять две произвольных строки, закинуть их в сегмент данных, "кипятить" до готовности. Говоря образно P.S. Но этот случай сподвиг меня разобраться, что же такое префикс-функция (на примерах из ЯВУ). P.P.S. Вывести одинаковые слова не проблема, проблема правильно сформулировать задачу из методички местечкового ВУЗа |
Сообщ.
#28
,
|
|
|
APleskan
Так какое твоё-то место во всей этой кухне? Студент, выполняющий задание? Преподаватель, создающий новую версию методички? Просто сочувствующий, решивший чёнить накодить на старом АСМе? или где? |
Сообщ.
#29
,
|
|
|
Имхо, фрилансер (окучивающий студентов местного вуза), который берется за то, что сам не умеет.
|
Сообщ.
#30
,
|
|
|
Лучше хоть что-то, чем вообще нихрена. Тем более, заказчик так и не рассчитался. Так что, все честно, на самом деле
|