На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS

Дорогие друзья! Поздравляем вас с Новым 2018 годом!

Всем удачи, успеха и благополучия!
В новом году ожидаем новых рекордов при подсчёте количества ёлочек на экране ;)


msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Не поленитесь, загляните в эти разделы перед созданием темы. Возможно, так уже имеется решение вашего вопроса.

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

Не забывайте также про главные ПРАВИЛА ФОРУМА!
Участники форума, нарушающие правила, будут наказываться, а вносящие вклад в развитие форума – приветствовать и, по возможности, награждаться :)

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

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


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

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

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

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

                      Добавлено
                      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, вроде нужно было вывести одинаковые слова в двух строках, а не кол-во вхождений одной строки в другую... нет? :)
                        user posted image Чат форума в Telegramuser posted image Чат форума в Discord (жми и подключайся!) ;)
                          Поскольку в методичке у заказчика строгой формулировки размера входных данных не было, то я пошел на это жульничество :blush:

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

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

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


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1377 ]   [ 17 queries used ]   [ Generated: 24.01.18, 11:41 GMT ]