Организация словарных статей просматривается на рисунке:
Словарная статья в СПФ имеет следующие поля в памяти:
'CFA - адрес начала словарной статьи, его содержимое 4 байта, равные адресу начала исполняемого кода этой статьи, этот адрес называется CFA.
Сразу за 4-мя байтами 'CFA идет байт флагов статьи - его адрес называется FFA.
За байтом флагов идут байты поля имени. Адрес первого байта этого поля называется
NFA. В этом байте находится число, равное числу символов в имени слова. Дальше идут байты ascii-символов имени. За ними начинается поле связи - всего 4 байта. Адрес первого байта поля связи называется LFA. Эти байты равны адресу NFA предыдущей словарной статьи. Порядок байт в словарной статье Little-Endian - в байте памяти с младшим адресом находится младший байт числа. После поля связи идут байты выравнивания (ALIGN-BYTES). Затем байты исполняемого кода, начинающиеся с адреса CFA.
Для просмотра организации словарных статей:
Код:
REQUIRE SEE lib\ext\disasm.f
: SHOW
HEX CR CR
' >R R@ WordByAddr 2DUP ." NAME " TYPE CR CR
SWAP DUP DUP DUP 6 - DUP ." 'CFA " 8 .0 ." ['CFA] " @ 8 .0 CR
2- DUP DUP ." FFA " 8 .0 ." b[FFA] " C@ 0x2 BASE ! 8 .0 0x10 BASE ! CR
SWAP 1- DUP ." NFA " 8 .0 ." B[NFA] " C@ 2 .0 CR
-ROT + DUP ." LFA " 8 .0
@ ." [LFA] " 8 .0 CR
R@ ." CFA " 8 .0 CR
C@ &IMMEDIATE AND ." IMM " . CR
CR ." CODE" R> REST
DECIMAL
;
STARTLOG
SHOW _CREATE-CODE
SHOW _CONSTANT-CODE
: idup DUP ; IMMEDIATE
SHOW idup
\ зная устройство словарной статьи например, создадим слово
\ которое обнуляет признак IMMEDIATE у слова немедленного исполнени
: UN-IMM
' WordByAddr \ NFA+1 U
DROP \ NFA+1
2- \ FFA
DUP C@ \ FFA [FFA]
0xFE AND \ FFA ~[FFA]
SWAP \ ~[FFA] FFA
C!
;
UN-IMM idup
SHOW idup
лог
Код:
NAME _CREATE-CODE
'CFA 00552005 ['CFA] 0055201C
FFA 00552009 b[FFA] 00000000
NFA 0055200A B[NFA] 0C
LFA 00552017 [LFA] 00000000
CFA 0055201C
IMM 0
CODE
55201C 8D6DFC LEA EBP , FC [EBP]
55201F 894500 MOV 0 [EBP] , EAX
552022 58 POP EAX
552023 C3 RET NEAR
END-CODE
NAME _CONSTANT-CODE
'CFA 00552024 ['CFA] 0055203C
FFA 00552028 b[FFA] 00000000
NFA 00552029 B[NFA] 0E
LFA 00552038 [LFA] 0055200A
CFA 0055203C
IMM 0
CODE
55203C 8D6DFC LEA EBP , FC [EBP]
55203F 894500 MOV 0 [EBP] , EAX
552042 58 POP EAX
552043 8B00 MOV EAX , [EAX]
552045 C3 RET NEAR
END-CODE
NAME idup
'CFA 00592310 ['CFA] 00592320
FFA 00592314 b[FFA] 00000001
NFA 00592315 B[NFA] 04
LFA 0059231A [LFA] 0059205B
CFA 00592320
IMM 1
CODE
592320 8945FC MOV FC [EBP] , EAX
592323 8D6DFC LEA EBP , FC [EBP]
592326 C3 RET NEAR
END-CODE
NAME idup
'CFA 00592310 ['CFA] 00592320
FFA 00592314 b[FFA] 00000000
NFA 00592315 B[NFA] 04
LFA 0059231A [LFA] 0059205B
CFA 00592320
IMM 0
CODE
592320 8945FC MOV FC [EBP] , EAX
592323 8D6DFC LEA EBP , FC [EBP]
592326 C3 RET NEAR
END-CODE