☰
用C语言写程序直接跑在CSS上:x86CSS的gcc-ia16交叉编译与构建管线完全指南
2026/10/23 21:10:51 网站建设 项目流程

【免费下载链接】x86CSS

x86CSS is a working CSS-only x86 CPU/emulator/computer. No JavaScript required.

项目地址:https://gitcode.com/gh_mirrors/x8/x86CSS
点击查看免费下载

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()运算拼成。整个流程是:

  1. 你用 C 写程序(入口函数是_start,不是main);
  2. gcc-ia16交叉编译器把它编译成 8086 机器码program.bin;
  3. 构建脚本把这段机器码逐字节"烧进"CSS 变量里,浏览器逐拍取指、译码、执行。

下面是官方演示程序CSS-OS的运行效果——它就是用 C 写的,包含斐波那契数列、帕斯卡三角和一个猜词小游戏 Horsle:

项目核心文件一览,构建管线围绕它们展开:

文件作用
c/main.c默认编译的 C 源码(CSS-OS 演示程序)
build_c.pygcc-ia16 交叉编译脚本,产出program.bin和program.start
build_css.py把机器码注入 CSS 模板,生成最终页面x86css.html
base_template.html手写的 CSS CPU 模板(含取指、译码、执行逻辑)
program.bin / program.start编译产物:机器码 +_start入口地址
x86-instructions-rebane.json8086 指令表(由 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 交叉编译的关键步骤:

  1. 编译:ia16-elf-gcc c/main.c -o tmp/main.a -nostdlib -Os
  2. 反汇编:用ia16-elf-objdump -Mi8086 -Mintel --adjust-vma=256输出可读的汇编(--adjust-vma=256正好对应程序加载地址 0x100),方便你对着浏览器里的执行效果调试;
  3. 找入口:用ia16-elf-nm提取_start函数的地址;
  4. 落盘:把机器码拷贝为 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_MS1024每个 CPU 周期的毫秒数,调小跑得更快
PROG_OFFSET0x100程序加载的内存地址
MEM_SIZE0x600内存总量 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):

符号地址功能
writeChar10x2000写 1 个字节到屏幕
writeChar40x2002写 4 字节串
writeChar80x2004写 8 字节串(输出字符串时按 8 字节分块调用它,效率最高)
readInput0x2006读一个键盘按键
SHOW_KEYBOARD0x2100写 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.

项目地址:https://gitcode.com/gh_mirrors/x8/x86CSS
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询