【发布时间】:2018-12-10 00:02:28
【问题描述】:
在Jonesforth中,字典条目的布局如下:
<--- 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 user-defined command 可行吗?还是更适合GDB Python 接口?
【问题讨论】:
标签: gcc assembly gdb gnu-assembler forth