Редактирование:
(FIND)
(раздел)
Перейти к навигации
Перейти к поиску
Внимание:
Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы
войдёте
или
создадите учётную запись
, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.
Анти-спам проверка.
Не
заполняйте это!
== Реализация == В [[Каллисто|Каллисто 1.0]] примитив (FIND) сперва ищет слово в [[Память двоичных данных|памяти данных]], а затем в [[Память программ|памяти программ]]: <pre> 739 ;#xFIND 740 ; (FIND) ( a1 a2 −− a3 c 1 | 0 ) Поиск слова a1 в словаре a2. Если найдено, вернуть nfa и байт счётчика. 741 ; Адрес_строки NFA => NFA длина TRUE/FALSE 742 ; В отличии от Форта ИТЭФ мы возвращаем NFA 743 ; a1 адрес строки со счётчиком −− слово, которое мы ищем (пока только в байтовой области) 744 ; a2 NFA первого слова в начале списка слов, где мы ищем 745 ; a3 NFA найденного слова в списке 746 ; c байт длины и флагов найденого в списке слова 747 ; Сделать поиск и сравнение по словам 748 ; 749 ; Здесь в качестве истины возвращается 1, хотя Каллисто перешло на стандарт −1/0 750 LPFIND: .DB 6 751 .TEXT "(FIND)" ; ( a1 a2 −− a3 c 1 | 0 ) 752 .DW LBRAN 753 PFIND: .DW JPFIND 754 JPFIND: 755 ; Сперва поиск в памяти данных 756 RM3 MA 1 + M3 757 PKRM03 1 EE 4 − MB ; RB адрес слова, которое мы ищем (строка со счётчиком) 758 KRMB M0 ; R0 Длина слова, которое мы ищем 759 RMB 1 + MB ; RB адрес первой литеры слова, который мы ищем 760 KRMA 761 DFAST: M5 1 EE 4 − FX>=0 PFIND2 762 MA M5 ; RA=M5 адрес NFA слова в списке слов, с которым сравниваем 763 KRMA PKM03 63 KAND ; TOS байт длины и флагов очередного слова из списка 764 RM0 − FX=0 DSKIP ; Если длины и флаг SMUDGE различны, пропустить слово 765 KRM5 KRMB − FX!=0 SLO ; Если ещё и первые литеры равны, сравнить слова подробней 766 DSKIP: PKRM03 31 KAND RMA + M5 767 KRM5 RME ∗ KRM5 + FX=0 DFAST ; LFA, Смотреть след. слово 768 PKM03 KGOTO9 ; Не нашли, в RX уже 0 769 SLO: RM0 M1 RMB M5 RMA 1 + M4 GOTO SLOIN 770 SLOL: KRM4 KRM5 − FX=0 DSKIP 771 SLOIN: FL1 SLOL 772 PKRM03 RMA 1 EE 4 + 773 PGOTO PFTAIL ; NFA, нашли! 774 775 ; Если слово не найдено, поиск в памяти программ 776 PFIND2: RM5 777 FAST: MA ; RA адрес NFA слова в списке слов, с которым сравниваем 778 KPRGM PKM03 63 KAND ; TOS байт длины и флагов очередного слова из списка 779 RM0 − FX=0 SKIP ; Если длины и флаг SMUDGE различны, пропустить слово 780 RMA 1 + KPRGM KRMB − PX!=0 SLOW ; Если ещё и первые литеры равны, сравнить слова подробней 781 SKIP: PKRM03 31 KAND 1 + RMA + 782 KPRGM FANS 1 + KPRGM 783 <−> RME ∗ + PX=0 FAST ; LFA, Смотреть след. слово 784 PKM03 KGOTO9 ; Не нашли, в RX уже 0 785 SLOW: RM0 M1 RMB M5 RMA 1 + GOTO SLOWIN 786 SLOWL: 1 + M8 ; R8 следующая литера 787 KPRGM KRM5 − PX=0 SKIP 788 RM8 789 SLOWIN: FL1 SLOWL 790 PKRM03 RMA 791 PFTAIL: PKM03 ; NFA, нашли! 792 <−> KM3 ; c 793 1 KM3 KGOTO9 ; 1 </pre> === Советская реализация === Слово (FIND) в ФОРТ-ЕС было [[примитив]]ом и устроено сложнее, чем в [[Каллисто]] и fig-Форте. Вот его описание и определение: <PRE> (FIND) * -1,AN,,,A1,T->CFA,C,TF/FF ИСКАТЬ СЛОВО T 34 В СПИСКАХ A1,,,AN ПРИ УСПЕХЕ ДАТЬ CFA ЕГО СТАТЬИ И C - БАЙТ ДЛИНЫ С ПРИЗНАКАМИ Экран номер 34 ( 31.03.86 (FIND/ ) CODE (FIND) ( -1,AN,..,,A1,Т->СFA,С,TF/FF ) RW2 POP, RW2 RMASK NR, RW2 RFORTH AR, ( ОБРАЗЕЦ) 0 0 SR, 0 0 (, 0 RW2 IC, 0 LENG1MSK N, ( ДЛИНА) 1 1 SR, 1 0 BCTR, BEGIN, RW1 PULL, ( ВХОД В ОЧЕРЕДНОЙ СПИСОК СЛОВ) 2 =F В, BEGIN, RW1 RFORTH AR, 14 0 (, 0 RW1 IC, 14 LEHGMASK N, 14 0 CR, ?E IF, 14 4 =F EX, 3 =F BE, THEN, 14 LENG1MSK N, RW1 2 (, 14 RW1 LH, 2 =H RW1 RMASK NR, ?Z UNTIL, RSTACK RTWO AR, 1 FIRST CH, ?E UNTIL, PUTRW1 B, BEGIN, RSTACK RTWO AR, 3 =H 1 FIRST CH, ?E UNTIL, 0 0 (, 0 RW1 IC, RW1 RFORTH SR, RW1 4 (, 14 RW1 LA, RW1 PUT, 0 PUSH, RW1 1 LR, PUSHRW1 B, 4 =H 1 (, 1 RW1 ), 1 (, RW2 CLC, END-CODE </PRE> В FORTH ИТЭФ слово (FIND) тоже было [[примитив]]ом, вот его определение: <PRE> HEAD 206Q,'(FIND',251Q,PFIND ; PFIND ; Адрес строки NFA => PFA длина TRUE/FALSE POP AX POP CX PUSH BP ; сохранение содержимого регистров PUSH SI PUSH DI MOV SI, CX SUB BP, BP MOV DI, AX MOV DX,WORD PTR [SI] AND DX, 77577Q CLD ; DF=0 (вперед) FAST: MOV CX,WORD PTR [DI] AND CX, 77477Q CMP DX, CX JE SLOW MATCH: CMP WORD PTR [DI], 0 JS $SIG ; BPL INC DI JMP MATCH $SIG: ADD DI, 2 CMP WORD PTR [DI],0 JE FAIL MOV DI,WORD PTR [DI] JMP FAST SLOW: MOV BP,WORD PTR [DI] MOV BX, SI JMP SLOW1 $LOOP: INC BX MOV AX,WORD PTR [BX] MOV CX,WORD PTR [DI] AND CX, 77777Q CMP AX, CX JNE MATCH SLOW1! INC DI TEST WORD PTR -1[DI],100000Q JE $LOOP MOV DX, BP ADD DI, 5 HOV AX, DI POP DI ; восстановление содержимого регистров POP SI POP BP SUB AX, 2 PUSH AX AND DX, 377Q ; байт длины PUSH DX ; в стек JMP TRUE ; Установка флага "Найдено" FAIL: POP DI POP SI POP BP JMP FALSE </PRE>
Описание изменений:
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см.
Pmkwiki:Авторские права
).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!
В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:
Отменить
Справка по редактированию
(в новом окне)
Навигация
Персональные инструменты
Вы не представились системе
Обсуждение
Вклад
Создать учётную запись
Войти
Пространства имён
Статья
Обсуждение
русский
Просмотры
Читать
Править
История
Ещё
Поиск
Навигация
Заглавная страница
Свежие правки
Случайная страница
Справка по MediaWiki
Инструменты
Ссылки сюда
Связанные правки
Служебные страницы
Сведения о странице