山羊 emoji 竟是合法的 x86 机器码

有人发现 🐐 的 UTF-8 字节 F0 9F 90 90 在 8086 上恰好是合法指令,于是一串 emoji 也能拼出能在 DOSBox 里跑的可执行程序。

你知道吗?emoji 也能当成可执行文件来跑。准确地说,只要把它们当作 Intel 8088 或 8086 的机器码看待,它们就是货真价实的指令。[GloriousCow] 分享了这一发现:完全用 emoji 就能凑出一个可执行程序。要理解其中的道理,得先往回退一步。

事情的起因纯属偶然。[GloriousCow] 注意到 🐐(山羊)这个 emoji 的编码是 F0 9F 90 90。熟悉 x86 汇编的人大概一眼就能认出 90h 就是 nop,空操作,也就是“花一个时钟周期什么都不干”。那 F0 和 9F 呢?它们连在一起是 lock lahf——先锁住总线,再把几个状态标志复制进 AH 寄存器;而在 8088/8086 上,这条指令实质上什么也不做。

也就是说,山羊 emoji(F0 9F 90 90)在技术上 100% 是合法机器码。它什么也不做,但好玩的地方从这里才开始。

DOSBox 中运行的 emoji 程序

emoji 的数量极其庞大,其中很多都以 F0 9F 开头、后面再跟两个字节,而这两字节的组合里有相当一部分同样是合法指令。那么,能不能用清一色的 emoji 拼出一个有实际功能的可执行程序?答案是可以,[GloriousCow] 就写了一个简单的 Hello World 来演示。

这个程序长这样:

🐸☺🐰🐎♐🗃🧯🧯🧯🐮💗🦮🪏♐🐰🐹🗃🧯🧯🧯🧯💗🪗🧯😗🧮🫪😗🧮😗🐮😪😔⭐

把这串 emoji 存进文件,加上 .com 后缀,在 DOSBox 里把 CPU 类型设为 8086 运行,它就会通过直接写显存的方式,在屏幕右下角打印出 HELLO。

原始博客文章里有更多细节,包括大量参考资料和教你用 emoji 自己写可执行程序的技巧。作者还做了一个复杂得多的 VGA 演示程序,同样全部由 emoji 构成,值得一看。

有些人可能知道,ASCII 字符也能以类似的方式使用,而且更灵活——它们不是四字节的组合。这种做法曾被用在 BASIC 程序里,把机器码巧妙地藏进 REM 注释之类的语句中,从而写出看起来古怪、却能做到 BASIC 本不该做到之事的代码。

图灵磁带

收录于

讨论

0 条评论

同分类推荐

复古游戏