使用'看'反汇编第四个代码字。

时间:2017-05-17 01:59:01

标签: forth gforth

我正在准备有关构建Forth解释器的整体知识,并希望反汇编一些通用的Forth代码字,例如+-*等。

My Gforth(我目前在Ubuntu Linux上安装了0.7.3版本)将允许我使用命令see反汇编我的冒号定义,以及单个代码字. 。但是,当我使用其他代码字see +see /进行尝试时,我收到错误消息Code +,然后我再也无法输入我的终端了,即使我按下control-c。

我应该能够反编译/反汇编代码字,如Gforth手册所示:https://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Decompilation-Tutorial.html

有没有其他人有这个问题,你知道如何修复它吗?

4 个答案:

答案 0 :(得分:3)

回到the old ptrace method为我做了。

首先,从命令行以用户 root 运行:

echo 0 >/proc/sys/kernel/yama/ptrace_scope

之后see应该反汇编它无法反编译的内容。命令行示例(不必是 root ):

gforth -e "see +  bye"

输出:

Code +  
   0x000055a9bf6dad66 <gforth_engine+2454>: mov    %r14,0x21abf3(%rip)        # 0x55a9bf8f5960 <saved_ip>
   0x000055a9bf6dad6d <gforth_engine+2461>: lea    0x8(%r13),%rax
   0x000055a9bf6dad71 <gforth_engine+2465>: mov    0x0(%r13),%rdx
   0x000055a9bf6dad75 <gforth_engine+2469>: add    $0x8,%r14
   0x000055a9bf6dad79 <gforth_engine+2473>: add    %rdx,(%rax)
   0x000055a9bf6dad7c <gforth_engine+2476>: mov    %rax,%r13
   0x000055a9bf6dad7f <gforth_engine+2479>: mov    -0x8(%r14),%rcx
   0x000055a9bf6dad83 <gforth_engine+2483>: jmpq   *%rcx
end-code

信用:Anton Ertl

答案 1 :(得分:1)

我见过的大多数SEE版本仅用于反编译冒号定义。 +和/和其他算术运算通常是用汇编代码编写的,而SEE不知道如何处理它们。这就是为什么您收到CODE错误消息的原因:它们是用代码而不是Forth编写的。我已经看到有多个内置了Forth实现的汇编程序,但是我认为我从未见过反汇编程序。看到+或/或其他此类单词的内部工作方式的最佳选择是使用DUMP或另一个此类单词获取该单词中的字节列表,然后手动反汇编该单词或将数据馈送到外部反汇编程序中。或者查看您是否可以找到实现或类似实现的源代码。

答案 2 :(得分:0)

SEE是一个没有严格控制的行为的单词。如果以

调用,则尽最大努力显示单词X的代码
  

看到X

根据操作的难度,其行为略有不同。如果您在会话中自己定义了该词,则几乎可以保证将代码找回来。如果它是内置单词,尤其是像 + 这样的非常基础的单词,则难度会更大。由于进行了优化或编译为机器代码,因此它看起来与原始定义几乎没有任何关系。

专门针对gforth(如果遇到困难),gforth调用系统上存在的标准工具来分析目标文件。因此,可能有必要安装gdb和/或研究gforth如何尝试与其连接。对于Ubuntu和gforth的具体示例0.7.3,Lutz Mueller给出了一个配方。

答案 3 :(得分:0)

我认为 SEE 按设计完成了它的工作。 FORTH 中有一些词在机器代码中定义(通常称为原语),并且用户也可以通过汇编程序定义机器代码,即: : MYCODE 汇编器助记符;CODE

所以 SEE 的输出显示的不是代码错误,而是(即)+ 字被定义为机器码,并且可以在其输出的右侧看到反汇编的助记符。