微处理器的最大操作码数

电器工程 微处理器
2022-01-13 13:13:11

在此处输入图像描述

该问题的操作码最大数量是多少,答案是c选项,但我认为是选项d,因为,每个地址指定每个内存位置,有16个地址行,即2^16个地址,即2^ 16 个内存位置。

因此,如果每个位置包含一个操作码,则总共 2^16 个位置包含 2^16 个操作码,这是操作码的最大数量,但答案为 c,即 2^12。这怎么可能?

4个回答

所有选项都是错误的处理器可以执行的(唯一)操作码的最大数量不受总线宽度的限制。


有人可能认为具有 12 位数据总线的 CPU 可能被设计为能够将其指令放入单个数据字中,以便它可以一次性读取指令 - 因为 2^12 = 4096 个操作码对于大多数目的。

但是,除了操作码之外指令还可能包含通常需要整个数据字的参数- 所以它们无论如何都不适合 - 在这一点上,尝试将操作码分成自己的字并不总是有用的:一些命令可能包含 6-一个字中有 6 位参数的位操作码,而其他操作码有一个 12 位操作码字加上几个数据字。但是 CPU 不能有 2^12 条指令,因为它无法区分这两种指令类型。

另一方面,正如评论中所指出的,有人说 x86 有超过 6000 个操作码(尽管并非所有操作码都具有独特的功能或有用)。

还有一点是,对于一个 4 位 CPU,虽然 2^4 = 16 条指令通常是不够的,所以它必须有一种方法来适应更多。

我的观点是操作码计数受 CPU 指令格式的限制,而不是受总线宽度的限制。

可能有多种方式和原因,CPU 可能包含比适合数据总线的操作码更多的操作码,包括:

跨词指令

处理器不需要在单个数据周期中读取命令 - 它可以使用多个相应的周期。事实上,大多数 CPU 都没有——尽管它更常用于指令参数而不是扩展操作码空间。

示例:intel 4004 只有 4 行复用为数据/地址线,4 位数据字,但 8 位指令中有 40 多个操作码。

前缀和后缀

(CISC)处理器可以根据需要具有尽可能多的指令前缀和后缀。

这些都以实际指令为前缀,以改变它的作用 - 一点点或完全。

这取决于您对“唯一操作码”的定义。如果假设不是数据的指令的任何部分是操作码的一部分,那么它们的总数将包括所有可能的变化。然而,有些人认为这些词缀是教学的不同部分。

示例:Intel x86 CPU 实际上没有 4M 的操作码。但是,如果您将所有前缀都算作操作码的一部分,现代 CPU 允许指令长达 15 个字节 - 这是很多可能的操作码。尽管许多人只会做同样的事情 - 所以这取决于他们是否“独特”的定义。

模式

一个处理器可能有多种操作模式,其中它可能有一组完全不同的操作码。

示例:intel x86_64 具有 32 位(real/v86/protected)和 64 位模式,它们具有不同的操作码。ARM CPU 可以具有 ARM 32 位和 thumb 16 位模式。

总线位复用

问题陈述了“数据线”和“地址线”,但是内部数据总线和内部地址总线都可能比实际总线线的数量更宽。

多路复用的总线数据按顺序发送,即前半部分,然后是后半部分。CPU 将其存储到全尺寸的内部寄存器中并对其进行操作。

通常这样做是为了降低成本和/或芯片物理尺寸。

示例包括 intel 4004,LPC 数据总线上的任何东西,以及 NEC VR4300,Nintendo64 的 CPU,只有 32 线数据总线。

没有并行总线

作为前一点的延续,CPU 甚至根本不需要暴露并行总线。

CPU 可能很容易只暴露一个顺序总线,例如 I2C、SPI 等。

生产这样一个专用 CPU 可能不太划算,但是许多低引脚数的微控制器(包括 CPU 和内存)都是这样制造的,以节省这些宝贵的引脚用于更有用的东西。例如 atmel ATTINY4/5/6/10 芯片总共只有 6 个引脚,2 个用于电源,1 个用于复位,3 个通用。指令通过专有的 3 线接口顺序发送。

根据您对微控制器的定义,它可以被认为是一个微处理器,也可以被编程为一个微处理器(即模拟一个具有顺序总线或总线的专用 CPU)。

这个问题清楚地表明某种数据总线被暴露,但并不是说它是并行总线。理论上,12 线数据总线可以由一条串行数据线和 11 条辅助/接地/状态线组成,尽管这可能不是一个非常理智的想法。

专用指令总线

实际上,处理器甚至不需要在与数据相同的总线上接受指令。

当 ALU 是分立芯片而不是微处理器的一部分但现在大多数时候在经济上不可行时,很容易出现这种情况。

但是没有什么能阻止您使用专用线来实现 CPU 仅用于指令。当必须对数据数组 (SIMD) 执行单个操作时,这样的 CPU 可能很有用。

由于指令总线宽度是完全任意的,因此最大可能的操作码数也是如此。

操作码的最大数量确实可以通过以下几种方式来考虑:

  • 唯一操作码的最大可能数量。

这可以从指令宽度而不是数据总线宽度中收集。通常一个操作码适合单个内存访问,然后答案是 2^12。但是处理器可以实现多周期操作码解码过程,以将可能的操作码数量扩展到 2^12 以上。

  • 处理器可以直接寻址的最大指令数(包含操作码)。

处理器可以直接寻址的最大指令数(包含操作码)受地址总线宽度 (2^16) 的限制。然而,处理器可以间接寻址更多内存,例如操作码可以促进页面交换或类似操作以从另一个源获取指令。

你对这个问题感到困惑是对的 - 它写得非常糟糕。

但是,我怀疑这个问题的目的是确定机器的指令字大小。鉴于提供的数据非常不完整,这必须对应于数据总线的宽度;地址总线的宽度决定了主存的最大大小。

在实践中,给定机器指令的“操作码”字段通常比指令本身小得多,但指令可能比数据总线宽。

旧的摩托罗拉 68008 就是一个很好的例子——它是 68000 的成本降低版本,具有 8 位数据总线,但它使用相同的 16 位指令字,其中通常 7 位确定操作码(其余识别源和目标寄存器,以及寻址模式,所有这些都应该被视为操作数,而不是操作码)。如果您在操作码中包含寻址模式位,就像某些人所做的那样,那么总共会产生一个 10 位的操作码字段。在某些寻址模式中,实际指令可能会更长。

Edson DeCastro 设计了一台几乎与此类似的计算机,即 PDP-8,具有 15 条地址和 12 条数据线。

所以发布的问题的答案是 574 个操作码,因为 PDP-8 有 284 个操作码,而 Ed 只是疯了一半。