次要目标是用75%的程序员都能理解的代码来实现。
《米尼福斯》Jakub Kądziołka,c.f。https://github.com/NieDzejkob/miniforthOne它的想法之一是放置可变地址(&;here,…)在最初的堆栈上。我们将其扩展到执行令牌和常量-1。
stage0由Jeremiah Oriansj编写,带有357字节x86的二进制种子,c.f。https://github.com/oriansj/stage0/
普朗克福斯中村光一,c.f。https://github.com/nineties/planckforthIt从一个字符的单词开始。因此,他的解析器是reallysimple,即它读取下一个字符。后来,他把这个扩展到了正常的范围。
小的forth核,我们可以在其上定义规则的forth by forthsource代码。两者都使用尾部代码共享,并将变量直接放入机器指令中。ITF-STC:间接表forth和子程序线程代码我们用一个字符的单词查找表替换了链表目录。
0w4tf:一个forth,有一个空字典,也就是说,它没有固定的单词。它有一个默认字和一些执行标记,-1,以及初始堆栈上变量的一些地址。刚刚够组装新福思原语。C.f.0w4tf
2wf:我的第一个第四核,字典里只有两个词(:和,)。它还具有执行令牌和堆栈上的变量。
带移位标志的八进制监视器,用于控制我们是读取下一个八进制数字,还是将下一个八进制数字发送到内存中。
我';我仍在使用32位linux编写测试环境的代码。它';现在2wf(作为监视器输入)的字节数减少到316字节,如果独立,则加载315字节。
键盘2wf的16位bios代码仅为237字节,由监视器加载231字节。两者都还没有调试。
在这些小尺寸的机器上,仅仅一个人就可以尽职尽责地严格检查每一点。
毫无疑问,我没有办法编写一个简短的跳转。Gnu as自己优化jmp,不提供类似jmpb AFAIK的东西。欢迎任何提示。
.macro jmpb target pre_jump_byte_\@:jmp\target。填充0xFFFFFF*(-2-pre_jump_byte_\@),8,0xdeadbeef#其大小为零或大。endm
.宏jmpb目标。db 0xEB,目标-($+1);十六进制代码和相对偏移量。填充0xFFFFFF*((目标-$)&;~0xff),8,0xdeadbeef。endm
二进制种子只是一个监视器,即一个代码加载程序。defaultone读取八进制数,并将其作为八位字节写入内存。
最后一个八位字节覆盖监视器的最后一个跳转偏移量。因此,我们跳进了新的代码。
八进制代码更容易解析并转换为八进制。我们只需要订阅';0'. 对于十六进制代码,我们必须减去';0' 或';A';或';a';。因此,八进制监视器比十六进制监视器小。
在x86硬件上,由于alt numpad输入法,我们可以使用读取八位字节的监视器。它允许我们直接计算肠胃直肠的数字。
否则八位组输入就是作弊。我们将手动输入二进制文件。那';它仍然是一颗二元种子。
监视器输入是一个最小的forth解释器,编译成机器代码,所有字节都反转并编码为八进制数。我们提供两种变体:
0w4tf-零单词四个token-forth:它没有常规的forth单词,如果找不到单词,则只有一个回退代码。此外,它在初始堆栈上包含4个执行标记、值-1和3个变量地址。
2wf-两个字:这是我第一次尝试。我把它搬到了一个独立的2wf分店。它只有两个常规的forth单词和一个精心挑选的首字母堆栈。堆栈包含一些执行令牌(xt)和一些变量地址。
纯粹主义者用笔和纸把汇编程序编译成机器代码;然后对字节进行八进制编码,手工输入结果。
如果你没有';不要接受八进制代码作为源代码,你可以把0w4tf的二进制作为一个小的二进制种子。
两个forth系统都可以轻松地放入512个八位字节(又称字节)的引导扇区。因此,它们本身很小,但与八进制监视器相比却很大。
对于那些没有';我们不喜欢将反向八进制代码作为源输入,而是提供了第四核的二进制种子。
因为体积小,我们没有';不要在启动时提供视觉反馈。这意味着盲目地输入大量字符。如果你没有';我推荐串行连接。它有一个pro,你可以在它上面附加一个简单的电子非数字记录器,它可以打印所有发送和接收的字节。这可以通过尽职调查进行严格检查。
我们从i386 linux的测试环境开始。在这种环境下,开发和调试代码更容易。
在Forth中实现一个hexcode字,例如hex0,参见[1]。[1] https://github.com/oriansj/stage0It's种子占用357字节;i、 e.远远超过2wf或0w4tf