Sectorforth 是一个 16 位 x86 Forth,可放入 512 字节的引导扇区 (2020)
摘要
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字符打印输出 |
变量
| 变量 | 描述 |
|---|---|
state | 0: 执行模式;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)。
相似文章
cl-forth:用CL实现的Forth 2012标准
CL-Forth 是 Forth 2012 标准的 Common Lisp 实现,支持多种 Lisp 实现和操作系统,并提供独立可执行文件选项。
Tumble Forth – 从汇编到操作系统,使用C编译器
Virgil Dupras 介绍一系列文章,旨在通过从零构建Forth系统和部分C编译器来教授低级编程,从裸机出发以开发操作系统概念。
@TrisH0x2A: 每个传统的 x86 BIOS 都会将引导扇区加载到同一地址:0x7C00,一本名为 539kernel 的免费书籍从 t… 开始
一条推文分享了一本名为 539kernel 的免费书籍,该书以地址 0x7C00 的 x86 引导扇区为起点,逐步构建整个操作系统,从第一条指令到可运行的内核。
教孩子们Forth编程
一位程序员分享了他们教初中和高中生Forth编程语言的经验,解释了为什么选择它而不是Python或Scratch,以及他们如何为12节课的课程设计教学大纲。
展示HN:我编写了一个能在UEFI机器上启动的BASIC解释器
Thoreau BASIC是一个兼容GW-BASIC的解释器,能在裸机UEFI系统和Windows上运行,具有现代增强功能,如图形功能、文本窗口和改进的性能。