Forth http://fforum.winglion.ru/ |
|
Реализация словарных статей в СПФ http://fforum.winglion.ru/viewtopic.php?f=24&t=1151 |
Страница 1 из 1 |
Автор: | chess [ Ср янв 30, 2008 20:00 ] |
Заголовок сообщения: | Реализация словарных статей в СПФ |
Организация словарных статей просматривается на рисунке: Словарная статья в СПФ имеет следующие поля в памяти: '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 |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |