На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Поиск одинаковых слов в строках , Вопрос по TASM
    Фигня имхо. Я бы, упрись мне скорость, скорее думал бы в направлении сравнения словами.
      REPE SCASB замечательно найдет пробел, а значит и предыдущий символ. Скорость данной конструкции превосходная.
        Akina Согласен, но посколько у заказчика сего не было обозначено четких требований к формату входных данных, слепил как говорится из того, что было ;) На досуге для себя может допилю таки. Хотя таких ископаемых динозавров как тасм давно пора оставить палеонтологам :D

        Добавлено
        ExpandedWrap disabled
           mov     dx,@data
           mov     ds,dx
           push    ds
           pop     es


        Ну дык стек надо подергать, че ему прохлажаться то?!

        Хотя если серьезно разбираю демо-примеры FASM DOS Гриштара я задавался тем же вопросом. Что это за стиль инициализировать сегмент данных через стек?!
          Цитата APleskan @
          Что это за стиль инициализировать сегмент данных через стек?!
          У меня в книжке "Программируем на языке ассемблера IBM PC" дословно эти строки так описаны:
          Цитата
          В нашей программе эти строки не имеют практического смысла, но вообще здесь продемонстрирован удобный приём переноса содержимого одного сегментного регистра в другой.
          :rolleyes:
            Цитата APleskan @
            Что это за стиль инициализировать сегмент данных через стек?!

            Компактности ради - PUSH/POP однобайтные. Хотя по скорости копированию из РОН проигрывают.
              А там не случится, что современные ЦП увидят подряд push/pop и всё внутрях перенесут почти столь же быстро аки и из РОНа?
                Akina, ясно понятно :yes:
                Сообщение отредактировано: APleskan -
                  Akina, т.е. по поводу второго, указанного Вами, недостатка нужно, например, сравнивать посимвольно на предмет совпадения каждый символ искомой подстроки с исходной строкой с 1-го символа исходной строки до ее конца, со второго до конца исходной строки и т.д.?
                  Конечно, получается совсем неэффективно с точки зрения алгоритма, но пока ничего другого в голову не пришло. Или есть лучшее решение?
                    Цитата APleskan @
                    Или есть лучшее решение?

                    Поиск слова в строке - двухэтапный. Сначала ищется первый символ, а при нахождении его - сравнивается посимвольно всё слово. Так вот - если второй этап неудачен, дальнейший скан по первому этапу следует проводить не с той точки. где закончился неудачный последний второй этап, а с той, где закончился последний первый этап. Т.е. указателей - два. И процедур соответственно две - первая ищет в одной строке заданный символ, вторая, вызываемая из первой, сравнивает два слова. И она же, если обнаружено совпадение, выполняет вывод.
                      Понял. Но все равно, мы же не возвращаемся назад при сравнении? Просматриваем строку слева направо из начала в конец (до нуль-терминатора)

                      Добавлено
                      Akina Бойер-Мур таки, вот это извращение :lol:
                      ExpandedWrap disabled
                        ;--------------------------------------------------------------------------------;
                        ;Вход: 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


                      Почти все уже украдено до нас написано до нас :P
                      Сообщение отредактировано: APleskan -
                        APleskan, вроде нужно было вывести одинаковые слова в двух строках, а не кол-во вхождений одной строки в другую... нет? :)
                          Поскольку в методичке у заказчика строгой формулировки размера входных данных не было, то я пошел на это жульничество :blush:

                          Там задача была поставлена так: взять две произвольных строки, закинуть их в сегмент данных, "кипятить" до готовности.
                          Говоря образно :)

                          P.S. Но этот случай сподвиг меня разобраться, что же такое префикс-функция (на примерах из ЯВУ). А то Седжвик, зараза, уже не напишет главу о алгоритмах на строках Пошел читать Кормена :D

                          P.P.S. Вывести одинаковые слова не проблема, проблема правильно сформулировать задачу из методички местечкового ВУЗа
                          Сообщение отредактировано: APleskan -
                            APleskan
                            Так какое твоё-то место во всей этой кухне? Студент, выполняющий задание? Преподаватель, создающий новую версию методички? Просто сочувствующий, решивший чёнить накодить на старом АСМе? или где?
                              Имхо, фрилансер (окучивающий студентов местного вуза), который берется за то, что сам не умеет.
                              Сообщение отредактировано: shm -
                                Лучше хоть что-то, чем вообще нихрена. Тем более, заказчик так и не рассчитался. Так что, все честно, на самом деле :D
                                Сообщение отредактировано: APleskan -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0396 ]   [ 16 queries used ]   [ Generated: 18.04.24, 12:16 GMT ]