在Jonesforth中,字典条目的布局如下:
我们可以使用GDB查看其中一个条目。 (有关使用Jonesforth的GDB的详细信息,请参见this question。)
让我们将
你可以大致看出这里正在发生什么。
前四个字节是指向字典中上一个单词的指针:
我们注意到
让我们使用GDB的
理想情况下,我只需要说类似这样的话:
<--- DICTIONARY ENTRY (HEADER) ----------------------->
+------------------------+--------+---------- - - - - +----------- - - - -
| LINK POINTER | LENGTH/| NAME | DEFINITION
| | FLAGS | |
+--- (4 bytes) ----------+- byte -+- n bytes - - - - +----------- - - - -
我们可以使用GDB查看其中一个条目。 (有关使用Jonesforth的GDB的详细信息,请参见this question。)
让我们将
SWAP
的字典条目的前16个字节显示为字符:>>> x/16cb &name_SWAP
0x105cc: -68 '\274' 5 '\005' 1 '\001' 0 '\000' 4 '\004' 83 'S' 87 'W' 65 'A'
0x105d4: 80 'P' 0 '\000' 0 '\000' 0 '\000' 43 '+' 0 '\000' 1 '\001' 0 '\000'
你可以大致看出这里正在发生什么。
前四个字节是指向字典中上一个单词的指针:
-68 '\274' 5 '\005' 1 '\001' 0 '\000'
然后是名称的长度:
4 '\004'
然后我们看到单词名称的字符,“SWAP”:
83 'S' 87 'W' 65 'A' 80 'P'
最后,添加一些填充以对齐到32位边界:
0 '\000' 0 '\000' 0 '\000'
我希望有一种方法可以更好地格式化单词输入。
如果我们执行以下操作:
>>> x/1xw &name_SWAP
0x105cc: 0x000105bc
我们注意到
name_SWAP
位于0x105cc
。让我们使用GDB的
printf
来显示单词条目:>>> printf "link: %#010x name length: %i name: %s\n", *(0x105cc), (char)*(0x105cc+4), (0x105cc+5)
link: 0x000105bc name length: 4 name: SWAP
好的,这不错!我们看到链接、名称长度和名称都被漂亮地显示和标记了。
这里的缺点是我必须在调用 printf
时使用显式地址:
printf "link: %#010x name length: %i name: %s\n", *(0x105cc), (char)*(0x105cc+4), (0x105cc+5)
理想情况下,我只需要说类似这样的话:
show_forth_word name_SWAP
它会显示上面的内容。
如何最好地解决这个问题? 这是否可以使用 GDB用户定义命令实现?还是更适合使用 GDB Python接口?
print_key name_SWAP
或print_key &name_SWAP
,我会得到以下提示:未加载符号表。请使用“file”命令。
。 - dharmatechx/1xw &name_SWAP
可以工作,但是print_key &name_SWAP
不行吗?这很难相信。 - Employed Russianset var ...
中漏了$
。已经更正。 - Employed Russian