Sectorforth 是一个 16 位 x86 Forth,可放入 512 字节的引导扇区 (2020)

Hacker News Top 工具

摘要

Sectorforth 是一个最小化的 16 位 x86 Forth 实现,可容纳于 512 字节的引导扇区中,允许用户在引导环境中编译和运行 Forth 代码。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/08/20 07:13

cesarblum/sectorforth

来源:https://github.com/cesarblum/sectorforth

sectorforth

sectorforth 是一个能放入512字节引导扇区的16位x86 Forth系统。

编写 sectorforth 的灵感来源于1996年的一个Usenet讨论帖(https://groups.google.com/g/comp.lang.forth/c/NS2icrCj1jQ),尤其是Bernd Paysan在该帖中的首条回复。

仅含核心组件

sectorforth仅包含上述Usenet帖子中提及的八个基本操作原语、五个用于操作内部状态的变量,以及两个I/O原语。

借助这组极简的构建模块,分支、编译、返回栈操作等功能均可通过Forth自身实现(请参考示例代码!)。

冒号编译器(:)已内置,因此可以便捷地定义新词(自然这也包含与之对应的分号;)。

与许多Forth实现不同,sectorforth不会尝试将未知词转换为数字,因为数字完全可通过现有原语生成。内置的两个I/O原语已足以编写支持数字解析的更强大解释器。

基本原语

原语栈效应描述
@(地址 – 值)获取指定地址的内存内容
!(值 地址 – )将值存储到指定地址
sp@( – sp)获取数据栈顶指针
rp@( – rp)获取返回栈顶指针
0=(值 – 标志)栈顶为0则返回-1,否则返回0
+(x y – z)将栈顶两数相加
nand(x y – z)对栈顶两数进行与非运算
exit( r:地址 – )弹出返回栈并跳转至指定地址继续执行
key( – x)将按键读取为ASCII字符
emit(x – )将x的低字节作为ASCII字符打印输出

变量

变量描述
state0: 执行模式;1: 编译模式(将词地址编入字典)
tib终端输入缓冲区,解析输入的来源
>in终端输入缓冲区的当前解析偏移量
here字典中下一个空闲位置的指针
latest字典中最新条目的指针

编译

sectorforth使用NASM 2.15.01开发。更早版本的NASM理论上也可编译,但未经测试验证。

编译sectorforth只需执行 make 命令:

$ make

该命令将生成编译后的二进制文件(sectorforth.bin)以及包含该二进制的软盘镜像文件(sectorforth.img)。

运行

makefile中包含两个用于在QEMU中运行sectorforth的目标:

  • debug 以调试模式启动QEMU并暂停执行,允许你在GDB中设置远程目标(target remote localhost:1234)并在sectorforth运行前设置断点。
  • run 直接在QEMU中运行sectorforth。

使用说明

每行最多可输入4KB内容。按下回车后,解释器将逐个解析并解释每个词(即根据state变量的当前值执行或编译该词)。

sectorforth不会显示Forth用户熟悉的 ok提示符。若词在字典中未找到,将以红色打印错误信息!!

当词在字典中未找到时,解释器状态将被重置:数据栈、返回栈及终端输入缓冲区被清空,解释器返回解释模式。其他错误(如在词定义中编译无效地址并尝试执行)不会被优雅处理,将导致解释器崩溃。

代码结构

代码注释默认读者熟悉Forth及其常规实现方式。

若不熟悉Forth,请阅读Leo Brodie的《Starting Forth》(https://www.forth.com/starting-forth)。

若不熟悉x86平台上的Forth实现,请参考Richard W.M. Jones的jonesforth汇编代码(http://git.annexia.org/?p=jonesforth.git;a=blob;f=jonesforth.S)。

sectorforth从jonesforth中汲取了大量灵感,但后者在注释中对基础概念的阐述更为详尽。

关于线程化代码技术及多架构Forth实现的优秀入门指南,请阅读Brad Rodriguez的《Moving Forth》(http://www.bradrodriguez.com/papers/moving1.htm)。

相似文章

教孩子们Forth编程

Lobsters Hottest

一位程序员分享了他们教初中和高中生Forth编程语言的经验,解释了为什么选择它而不是Python或Scratch,以及他们如何为12节课的课程设计教学大纲。