停下来并着火

2026-05-16 1 阅读 ScottWRobinson
帖子 《Halt and Catch Fire》 作者:Scott Robinson · May 15, 2026 我从来没有看过 AMC 的节目《Halt and Catch Fire》,很长一段时间我只知道标题,但对这部剧一无所知。它的某些东西总是让我想起程序员的幽默:有点戏剧化,有点荒谬,但又异常精确。事实证明,该剧确实是关于 20 世纪 80 年代和 1990 年代的计算机行业的,但这个短语本身比该剧要古老得多,而且它最初只是一些工程幽默。含义 在计算机环境中,Halt and Catch Fire(缩写为 HCF)已被概括为描述导致 CPU 停止执行任何有用操作的机器代码,迫使您只能通过重置(或重新启动)机器来恢复。从字面意义上来说,它“停止”了机器。当然,“着火”部分是一个笑话,但它并不像看起来那么牵强。以IBM System/360为例。显然,当这个系统遇到某个无效操作码时,它会不断地访问磁芯存储器中的特定位置,从而导致磁芯存储器变得非常热,甚至着火。随着时间的推移,HCF 也成为了一个包罗万象的标签,包括锁定处理器的未记录或无效操作码、看起来像挂起的有意测试模式以及真正的硬件错误(您甚至可能还记得,一些早期的奔腾级芯片可能会被精心选择的非法指令锁定,称为 F00F 错误 - 稍后会详细介绍)。这个短语的创建部分是因为使用三字母汇编助记符的标准: ADD 、 CMP 、 JMP 等。这个笑话在各种出版物中传播,包括 HCF 以及我个人最喜欢的其他一些: EPI :立即执行程序员 DC :分而治之 CRN :转换为罗马数字 The Motorola 6800 所以 HCF 基本上只是一个笑话,直到它不是。 Motorola 6800 有 256 个单字节操作码,但并非每个位模式都对应于记录的指令。如果击中错误,芯片就会执行硅“解码”的任何操作——有时没什么,有时却很重要。 Gerry Wheeler 的 BYTE 文章“未记录的 M6800 指令”发表于 1977 年 12 月,第 2 卷第 12 期,位于技术论坛第 46-47 页。他从摩托罗拉自己的文档开始:记录了 197 个操作码,其中有 59 个位模式在官方故事中没有说明。其中一些行为类似于 NOP,一些以惠勒所说的当时仍“未破译”的模式更改了条件代码寄存器,而两个字节——$9D 和 $DD——共享一个特别令人讨厌的结果,他选择称之为“停止并着火”。他明确表示“助记词当然是我指定的”。从硬件角度来看,实际发生的情况是,该部件不再像正常的获取-解码-执行引擎一样运行:程序计数器不断前进,芯片问题读取,而地址线像硬件计数器一样穿过内存。中断不会阻止你走上自我毁灭的道路——你只能通过重置或重启来摆脱循环。惠勒自己的描述值得阅读原文,而不是转述:当运行该指令时,查看它正在做什么的唯一方法是使用示波器。从用户的角度来看,机器停止运行并且无法重新启动。地址总线上有指示灯的人会看到处理器开始按顺序非常快地读取所有内存。实际上,地址总线变成了一个 16 位计数器。然而,处理器不会注意到它正在读取什么......它只是读取。在这句话的“着火”部分,他补充道,“嗯,差不多了。”虽然 IBM 系统确实在某些情况下起火,但 Motorola 6800 似乎没有。除了 BYTE 之外,同一操作码系列还获得了其他昵称。 David J. Agans 在《调试》(2002 年)中回忆道,DD 是他的团队所称的“Drop Dead”指令(相同的总线行走技巧,不同的名称),并指出工程师故意使用它,因为“所有地址和时钟线都很好,在示波器上循环方波”。大多数机器只感觉像是挂起来了。至少在一台具有精细内存映射视频的早期 6800 微型计算机上,该图案可以显示为可见的“雪”。 Ben Z 的 Sphere News 文章是一个值得深入研究的好地方(视频 RAM 仲裁、计时、CRT 伪像)。几年后,摩托罗拉工程师就同一问题撰写了更多文章。在 IEEE Design & Test (1985) 中,Daniels 和 Bruce 描述了客户在 MC6800 上发现的非法操作码,内部昵称 HACOF,其中程序计数器可以永远递增直到重置。他们还讲述了一个几乎令人难以置信的细节:产品工程想要一种在启动期间快速扫描 RAM 的方法,认识到这种行为已经做了类似的事情,并且基本上保留了它而不是付费删除它。所以,用鲍勃·罗斯的话说,这结果是一次“幸福的意外”。最近,有人实际上在硬件上安装了真正的 MC6800,并且实际上