【免费下载链接】x86CSS
x86CSS is a working CSS-only x86 CPU/emulator/computer. No JavaScript required.
x86CSS是一个纯 CSS 实现的 16 位 x86 CPU 模拟器(完全不需要 JavaScript),你可以用C 语言写程序,通过gcc-ia16 交叉编译成 8086 机器码,让浏览器里的这台"CSS 计算机"直接执行它。本文是 x86CSS构建管线的完全指南:安装 gcc-ia16 交叉编译器、运行 build_c.py 生成机器码、再用 build_css.py 一键产出最终页面x86css.html🚀
x86CSS 是什么?一台跑在 CSS 里的真·CPU
先说结论:x86CSS 里执行的就是你电脑 CPU 运行的那种机器码(原版 16 位 8086 指令集),只是"处理器"由 CSS 变量、@property和calc()运算拼成。整个流程是:
- 你用 C 写程序(入口函数是
_start,不是main); gcc-ia16交叉编译器把它编译成 8086 机器码program.bin;- 构建脚本把这段机器码逐字节"烧进"CSS 变量里,浏览器逐拍取指、译码、执行。
下面是官方演示程序CSS-OS的运行效果——它就是用 C 写的,包含斐波那契数列、帕斯卡三角和一个猜词小游戏 Horsle:
项目核心文件一览,构建管线围绕它们展开:
| 文件 | 作用 |
|---|---|
| c/main.c | 默认编译的 C 源码(CSS-OS 演示程序) |
| build_c.py | gcc-ia16 交叉编译脚本,产出program.bin和program.start |
| build_css.py | 把机器码注入 CSS 模板,生成最终页面x86css.html |
| base_template.html | 手写的 CSS CPU 模板(含取指、译码、执行逻辑) |
| program.bin / program.start | 编译产物:机器码 +_start入口地址 |
| x86-instructions-rebane.json | 8086 指令表(由 extra/gen_inst.py 从 extra/8086_table.txt 生成) |
构建管线总览:.c 到 HTML 三步走
整个构建管线非常干净,只有三步:
c/main.c ──python3 build_c.py──▶ program.bin + program.start │ python3 build_css.py ▼ x86css.html(浏览器直接打开即可运行)开始前先克隆仓库:
git clone https://gitcode.com/gh_mirrors/x8/x86CSS cd x86CSS⚠️ 构建管线支持Linux 和 WSL1/2(脚本会自动检测 Windows 环境并加
wsl前缀),macOS 未经验证。
第一步:安装 gcc-ia16 交叉编译器(一键安装步骤)
gcc-ia16 是专为 8086/16 位 x86 打造的 GCC 交叉工具链,提供ia16-elf-gcc、ia16-elf-objdump、ia16-elf-nm三个关键工具。获取方式有两种:
- 方式 A:从 PPA 软件源直接安装(Ubuntu 用户最省事);
- 方式 B:自行编译 build-ia16 项目(适合想要最新版本的玩家)。
装好后验证一下:
ia16-elf-gcc --version能看到版本号就说明 gcc-ia16 交叉编译器就绪 ✅
第二步:build_c.py 交叉编译 C 代码为 8086 机器码
python3 build_c.py一条命令完成四件事,这也是 gcc-ia16 交叉编译的关键步骤:
- 编译:
ia16-elf-gcc c/main.c -o tmp/main.a -nostdlib -Os - 反汇编:用
ia16-elf-objdump -Mi8086 -Mintel --adjust-vma=256输出可读的汇编(--adjust-vma=256正好对应程序加载地址 0x100),方便你对着浏览器里的执行效果调试; - 找入口:用
ia16-elf-nm提取_start函数的地址; - 落盘:把机器码拷贝为 program.bin,把入口地址(当前值为
599)写入 program.start。
两个可自定义的点,见 build_c.py:
BASE_NAME = "main" # 编译 c/[BASE_NAME].c,换文件名改这里 FLAGS = "-nostdlib -Os" # 优化级别,也可以换 -O2- 编译目标是裸机程序,所以用
-nostdlib(不链接标准库),I/O 全靠 x86CSS 提供的自定义函数指针(见下文); - 想换成更简单的示例?把
BASE_NAME改成"example"即可编译 c/example.c; - 改完 C 代码记得重跑
build_c.py,再跑第三步。
第三步:build_css.py 把机器码注入 CSS(最快配置方法)
python3 build_css.py(Python3 直接运行,零依赖)读取 program.bin、program.start 和 base_template.html,做占位符替换后输出最终页面x86css.html。
控制整台"计算机"的常量都在 build_css.py 开头:
| 常量 | 默认值 | 含义 |
|---|---|---|
CPU_CYCLE_MS | 1024 | 每个 CPU 周期的毫秒数,调小跑得更快 |
PROG_OFFSET | 0x100 | 程序加载的内存地址 |
MEM_SIZE | 0x600 | 内存总量 1.5KB,程序不够大就调这里 |
IP 寄存器的初始值 =PROG_OFFSET+program.start中的数字(599),即0x100 + 599 = 0x357,CPU 从这开始取指。
x86CSS 还预留了一段自定义 I/O 内存映射(见 build_css.py):
| 地址区间 | 用途 |
|---|---|
| 0x100 起 | 你的程序(机器码逐字节写入 CSS 变量) |
| 0x2000–0x2010 | 外部函数:写屏、读键盘 |
| 0x2100–0x2110 | 外部 I/O:如SHOW_KEYBOARD键盘显隐开关 |
自定义 I/O 速查表:写屏幕与读键盘
在 C 里,把这几个地址绑定到函数指针就能"操作系统"了(参考 c/main.c):
| 符号 | 地址 | 功能 |
|---|---|---|
writeChar1 | 0x2000 | 写 1 个字节到屏幕 |
writeChar4 | 0x2002 | 写 4 字节串 |
writeChar8 | 0x2004 | 写 8 字节串(输出字符串时按 8 字节分块调用它,效率最高) |
readInput | 0x2006 | 读一个键盘按键 |
SHOW_KEYBOARD | 0x2100 | 写 1=数字键盘、2=字母键盘、0=隐藏 |
典型初始化(只需这么一小段,其余照普通 C 写):
writeChar1 = (void*)(0x2000); writeChar8 = (void*)(0x2004); readInput = (void*)(0x2006);彩蛋:字符集里0x80是 🐴,0x83是 🟩——写writeChar1(0x80)就能在屏幕上打印小马,演示程序 Horsle 的"马味"就这么来的 🐎
运行成果:浏览器里打开你的 CSS 计算机
- 用Chromium 系浏览器(Chrome、Edge 等)直接打开
x86css.html即可运行; - 零交互:CPU 时钟由 CSS 动画 + 容器查询驱动,鼠标不用动它就在跑(可选的脚本时钟只是锦上添花,禁用 JS 依然能执行);
- 屏幕下方还能实时看到 AX、CX、IP 等寄存器数值和屏幕内存,相当于自带调试面板。
常见问题清单
- 程序放不下?默认内存只有 1.5KB(
MEM_SIZE = 0x600),去 build_css.py 调大后再重新构建。 - 入口函数写错?裸机程序入口必须是
_start,main不会被找到。 - 跑得慢?调小
CPU_CYCLE_MS,或确认用了-O2优化。 - 某条指令行为不对?项目实现了"大部分"8086 指令集,个别标志位(如 CF/OF)行为不完美,属于已知取舍,详见 README.md 的 Compatibility 章节。
- 想深入 CPU 原理?指令表由 extra/8086_table.txt(8086 操作码表)+ extra/gen_inst.py 生成,模板中的译码逻辑都在 base_template.html 里。
照着这条 gcc-ia16 交叉编译 + 双脚本的构建管线走一遍,你的 C 程序就真正"跑在 CSS 上"了——去把 c/main.c 里的三个 demo 换成你自己的代码吧!
【免费下载链接】x86CSS
x86CSS is a working CSS-only x86 CPU/emulator/computer. No JavaScript required.
相关推荐
在 FreeBSD 上构建 .NET CoreCLR:Docker 交叉编译、Linux 交叉编译与直接构建全指南
在 FreeBSD 上构建 .NET CoreCLR:Docker 交叉编译、Linux 交叉编译与直接构建全指南 本文基于 dotnet/runtime 仓库
语言运行时标准库编译器JIT编译内存管理并发编程在树莓派上构建 Apache MXNet:原生编译与交叉编译全流程指南
在树莓派上构建 Apache MXNet:原生编译与交叉编译全流程指南 MXNet 官方支持在 ARM 设备(如树莓派)上运行,本文基于仓库中的 树莓派构建指南
深度学习人工智能机器学习分布式训练上交 SJTU 编译原理课程指南:从零用 C++ 构建 Tiger 语言编译器
上交 SJTU 编译原理课程指南:从零用 C++ 构建 Tiger 语言编译器 本篇指南围绕本仓库《计算机自学指南》收录的上海交通大学编译原理课程展开,详细介绍
文档教程知识库
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考