Как сбросить слово в Форте?

Цель состоит в том, чтобы создать слово Forth в словаре, а затем распечатать содержимое памяти этого слова. Первый шаг прост. Слово : main создается, как описано в учебнике. После создания слова указатель словаря перемещается на следующую позицию, поэтому мне приходится вычитать из него некоторые элементы, и теперь можно выгрузить область памяти, в которой слово было создано:

\ create a dummy routine
: main 1 dup + . ;

\ put dictionary pointer to the stack
\ and subtract 50 indizies
dp 50 - 

\ print out 20 cells to the screen from dp-50 until dp+50
\ but where is my newly created routine ": main"?
100 dump

bye
------
gforth "a.fs"

7F81DF443FC6: 00 00 20 17  12 AF 60 55 - 00 00 04 00  00 00 00 00  .. ...`U........
7F81DF443FD6: 00 00 A0 58  14 AF 60 55 - 00 00 10 00  00 00 00 00  ...X..`U........
7F81DF443FE6: 00 00 FF FF  FF FF FF FF - FF FF 00 00  00 00 00 00  ................
7F81DF443FF6: 00 00 50 82  49 DF 81 7F - 00 00 F8 3F  44 DF 81 7F  ..P.I......?D...
7F81DF444006: 00 00 08 82  49 DF 81 7F - 00 00 F0 81  49 DF 81 7F  ....I.......I...
7F81DF444016: 00 00 32 00  00 00 00 00 - 00 00 00 00  00 00 00 00  ..2.............
7F81DF444026: 00 00 00 00 

К сожалению, область памяти, показанная командой dump, не имеет раздела, начинающегося с : main, а также отсутствуют операторы внутри слова 1 dup .... Так где именно находится вновь созданное слово? Как я могу увидеть необработанные байты в памяти?


person Manuel Rodriguez    schedule 14.01.2019    source источник


Ответы (1)


1) Существует предопределенное слово see, которое должно делать то, что вы хотите, и просмотр соответствующих источников должен дать вам подсказку.

2) Ваш подход работает только для определенной модели памяти, т.е. е. размещение имен и кода в одном регионе, что далеко не гарантировано. (Я не уверен, будет ли это работать для Gforth ). От dup, 1, + и т. д. вы ничего не узнаете, так как они заменены соответствующими адресами или инструкциями вызова.

person guidot    schedule 14.01.2019