(FIND): различия между версиями
Перейти к навигации
Перейти к поиску
AtH (обсуждение | вклад) |
AtH (обсуждение | вклад) (→Ссылки) |
||
(не показано 14 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
'''(FIND)''' — | '''(FIND)''' — архаичное слово [[Каллисто]]. | ||
(FIND) ( a1 a2 −− a3 c 1 | 0 ) Поиск слова a1 в словаре a2. Если найдено, | |||
Искать слово a1 в | вернуть nfa и байт счётчика. | ||
Искать слово a1 в наборе слов a2. При успехе дать [[NFA]] его статьи и c - байт длины с флагами. | |||
== Ввод слова (FIND) == | == Ввод слова (FIND) == | ||
В [[Режим NUM|режиме NUM]] последовательно нажмите клавиши | В [[Режим NUM|режиме NUM]] последовательно нажмите клавиши {{ШГ→}} [[Клавиша Р-ГРД-Г|{{Чёрная клавиша|Р-ГРД-Г}}]] [[Клавиша П|{{Чёрная клавиша|П}}]] [[Клавиша 7|{{Серая клавиша|7}}]] [[Клавиша 4|{{Серая клавиша|4}}]] [[Клавиша K|{{Синяя клавиша|K}}]] [[Клавиша P|{{Синяя клавиша|P}}]] {{ШГ←}} | ||
== (FIND) в fig-FORTH Release 1 glossary, май 1979 (англ.) == | == (FIND) в fig-FORTH Release 1 glossary, май 1979 (англ.) == | ||
Строка 13: | Строка 14: | ||
length byte of name field and boolean true for a good match. If no | length byte of name field and boolean true for a good match. If no | ||
match is found, only a boolean false is left. | match is found, only a boolean false is left. | ||
== Реализация == | |||
В [[Каллисто|Каллисто 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> | |||
== Ссылки == | |||
* {{Исходник|xFIND|(FIND)}} | |||
* См. также слово [[FINDN]] | |||
Строка 18: | Строка 164: | ||
{{заготовка}} | {{заготовка}} | ||
[[Категория:Слова Каллисто]] | [[Категория:Слова Каллисто]] | ||
[[Категория: | [[Категория:Примитивы]] | ||
[[Категория: | [[Категория:Управление поиском слов]] |
Текущая версия от 06:33, 9 ноября 2017
(FIND) — архаичное слово Каллисто.
(FIND) ( a1 a2 −− a3 c 1 | 0 ) Поиск слова a1 в словаре a2. Если найдено, вернуть nfa и байт счётчика.
Искать слово a1 в наборе слов a2. При успехе дать NFA его статьи и c - байт длины с флагами.
Ввод слова (FIND)[править]
В режиме NUM последовательно нажмите клавиши ШГ→ Р-ГРД-Г П 7 4 K P ШГ←
(FIND) в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]
(FIND) addr1 addr2 --- pfa b tf (ok) addr1 addr2 .--- ff (bad) Searches the dictionary starting at the name field address addr2, matching to the text at addr1. Returns parameter field address, length byte of name field and boolean true for a good match. If no match is found, only a boolean false is left.
Реализация[править]
В Каллисто 1.0 примитив (FIND) сперва ищет слово в памяти данных, а затем в памяти программ:
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
Советская реализация[править]
Слово (FIND) в ФОРТ-ЕС было примитивом и устроено сложнее, чем в Каллисто и fig-Форте. Вот его описание и определение:
(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
В FORTH ИТЭФ слово (FIND) тоже было примитивом, вот его определение:
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
Ссылки[править]
- Исходный текст слова (FIND) в Каллисто Классик 1.0
- См. также слово FINDN
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |