ISA 操作码---它们来自哪里?

电器工程 二进制 指令系统
2022-01-29 13:20:17

当工程师在设计指令集架构时,在将某些二进制代码指定为指令时,他们遵循什么程序或协议(如果有)。例如,如果我有一个说 10110 是加载指令的 ISA,那么该二进制数是从哪里来的?它是从表示加载操作的有限状态机的状态表中建模的吗?

编辑:在做了更多研究之后,我相信我想问的是如何分配各种 CPU 指令的操作码。ADD 可能被指定为操作码 10011;加载指令可能被指定为 10110。为指令集分配这些二进制操作码的过程是什么?

4个回答

这取决于ISA的年龄。

在手工设计的早期,甚​​至当 CPU 由离散逻辑组装时更是如此,逻辑设计将首先出现,并被广泛最小化,然后 ISA 位模式将成为使其最小化所需的任何值逻辑工作。

因此,可能存在一种特定的控制信号模式,使一些多路复用器能够将 ALU 输出连接到 GP 寄存器文件的输入,还有一些控制信号指示 ALU 进行加法、减法、AND、OR 等操作,还有一些地址位到寄存器文件中。这三组信号将形成指令中的字段。每个组将保持在一起,其详细含义来自该单元(ALU 等)的设计,但组可以按任何顺序排列,直到您设计指令解码器。(x86 已经足够老了,如果你看对了地方,你可以发现其中的一些——它不是一个全新的设计,而是借鉴了旧的 8080)

后来的 ISA 可能会被“清理”并变得更规则和更易于使用,硬件在它们和实际的硬件级控制信号之间进行转换,有时通过“微码”。这些被称为“CISC”或“复杂指令集编码”。x86“Rep”指令前缀就是一个简单的例子——它会导致以下指令重复多次,以节省编写 FOR 循环的麻烦。

后来(在 1980 年代)又回到了更简单的直接编码风格(RISC - 精简指令集编码),您可以在 ARM 处理器中看到这种风格。这是由当时小型 ASIC 驱动的,以及在其上放置 32 位 CPU 的愿望,因此没有多余的容量用于复杂的指令集解码器,以使整个 CPU 减少到大约 20,000 个门。(还有暂时的性能提升,因为人们还没有开发出使 CISC 解码器快速的技术——大约在 1995 年的 Pentium Pro 中出现)

而现在这无关紧要——CPU一次读取几条指令,并投入数百万个晶体管来解码它们,重新排序它们,并一次执行尽可能多的指令,以加速可能为最古老的程序编写的程序ISA的风格。

如果将类似的指令组合在一起,就会出现模式。这在 ARM 中非常明显,ISA 手册实际上向您显示了指令字的哪一位对应于功能、寄存器选择等。但也可以推断为X86

最终,操作码的“功能”部分进入一些二进制到一热解码器,该解码器实际上激活了特定功能或流水线操作序列。它们通常与任何状态机的内容无关,除非我们正在考虑需要状态机解码的可变长度指令。

在很多情况下,随着 ISA 随着时间的推移而增长,选择是相当随意的,或者基于“最适合的地方”。然而,MOS 6502 是一个很好的芯片示例,其中 ISA 设计受到试图从有限晶体管中挤出尽可能多的东西而受到严重影响。

观看此视频,了解如何对6502进行逆向工程,尤其是从 34:20 开始。

6502 是 1975 年推出的 8 位微处理器。虽然它的门数比 Z80 少了 60%,但速度却是 Z80 的两倍,虽然它受到更多限制(在寄存器等方面),但它用一个优雅的指令集。

它只包含 3510 个晶体管,这些晶体管是由一小队人在一些大塑料片上爬行时手工抽出的,这些塑料片后来被光学缩小,形成了 6502 的各个层。

正如您在下面看到的,6502 将指令操作码和时序数据传递到解码 ROM,然后将其传递到“随机控制逻辑”组件,其目的可能是在某些复杂情况下推翻 ROM 的输出。

6502框图

在视频中的 37:00,您可以看到解码 ROM 的表格,其中显示了输入必须满足哪些条件才能为给定的控制输出获得“1”。您也可以在此页面上找到它。

你可以看到这张表中的大部分东西在不同的位置都有X。让我们举个例子

011XXXXX 2 X RORRORA

这意味着操作码的前3位必须是011,G必须是2;别的都无所谓。如果是这样,名为 RORRORA 的输出将变为真。所有的 ROR 操作码都以 011 开头;但还有其他以 011 开头的指令。这些可能需要由“随机控制逻辑”单元过滤掉。

所以基本上,选择操作码是为了让需要做同样事情的指令在它们的位模式中有一些共同点。您可以通过查看操作码表来看到这一点;所有的 OR 指令都以 000 开头,所有的 Store 指令都以 010 开头,所有使用零页寻址的指令都是 xxxx01xx 的形式。当然,有些指令似乎并不“适合”,因为其目的不是拥有完全规则的操作码格式,而是提供强大的指令集。这就是为什么“随机控制逻辑”是必要的。

我上面提到的页面说ROM中的一些输出线出现了两次,“我们假设这已经完成,因为他们无法将某些线的输出路由到他们想要的地方,所以他们将同一条线放在不同的位置再次定位。” 我可以想象工程师们一个一个地手绘这些门,然后突然意识到设计中的一个缺陷,并试图想出一种方法来避免重新启动整个过程。

有人在某个时候坐下​​来定义了它们。

一个好的 ISA 将使解码器尽可能简单。

例如,使用 ALU 指令,您可以让操作码的某些位直接发送到 ALU 的控制线。