微处理器的最大操作码数


13

在此处输入图片说明

问题的最大操作码是多少,答案是c选项,但我认为它是选项d,因为每个地址指定每个内存位置,共有16条地址线,这意味着2 ^ 16个地址,即2 ^ 16个存储位置。

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


7
问题是询问ISA中有多少个不同的操作码,而不是有多少条指令可以组成最大的程序。
布莱恩·德拉蒙德

5
@BrianDrummond-用这种解释,但是,只有假设您对ISA的工作方式不是通用的,这个问题才有意义。例如,Z80具有8位数据总线,但在800种有效有效操作码范围内的某处-因为它使用前缀字节来扩展和改变可用的操作。
朱尔斯

15
书中所说的问题是没有道理的。总线大小和操作码大小之间没有固有的直接对应关系。JVM基于32位数据模型,但具有8位操作码。
克莱里斯

10
除非我们除了问题中提供的大量信息外,否则这个问题是不连贯的。为了获得答案,我们必须对过程的特性进行很多假设-这些假设对于大多数现实世界中的处理器而言都不正确!
David Schwartz '18

14
问题是胡扯。如有必要,指令操作码可以跨越多个存储字。没有固有的限制。
热舔

Answers:


31

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


通常,一个12位以上的CPU被设计为每个数据字具有一个命令,因此它可以一次读取大多数指令。因此,将普通CPU设计为2 ^ 12个操作码的限制。

现有的具有超过2 ^ 12 = 4096个操作码的CPU体系结构非常罕见,这仅仅是因为人们几乎不需要太多的东西-太多的东西要学习,太多的东西才真正有用,太多的东西浪费了昂贵的硅空间。

更新:正如评论中指出的,x86指令集的所有可能变体实际上可能总计超过6000个,具体取决于您的计数方式!不过,这更是一个例外。

但是,对于4位CPU,2 ^ 4 = 16条指令通常是不够的,因此许多此类处理器拥有更多指令。

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

跨字说明

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

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

前缀和后缀

(CISC)处理器可以根据需要具有任意数量的指令前缀和后缀。

这些指令以实际指令为前缀来更改其功能-稍微或完全改变。

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

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

模式

处理器可以具有多种操作模式,在其中可以具有完全不同的一组操作码。

示例:intel x86_64具有32位(真实/ v86 /受保护)和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个引脚,其中两个用于供电,一个用于复位,三个通用。指令通过专有的三线接口顺序发送。

根据您对微控制器的定义,可以将其视为微处理器,也可以将其编程为充当一个微处理器(即,使用一个或多个顺序总线来模拟专用CPU)。

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

专用指令总线

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

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

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

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


4
作为一个兴趣点,X86-64具有操作码1000和6000之间,这取决于你问(谁123)。
LMS

从未尝试甚至数过它们,但是有了所有的变化才有意义。
杰克·怀特

13

实际上,可以通过以下两种方式来考虑最大数量的操作码:

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

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

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

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


2
问题不是那么模棱两可。如果应该将其解释为您的第二点,那么它将被表述为“ 可以存储/寻址/ ... 的最大指令数”。“操作码”一词非常清楚,它与指令集有关,​​而不与可寻址范围有关。
对SE失去信心的人

11
+1表示多字操作码是完全可能的,因此这个问题不是一个很好的问题。
Spehro Pefhany,

2
以英语为母语的母语人士通常会带有偏见,这使他们很难仅理解所用单词的裸露含义。当说国际英语的人阅读或听到这些信息时,他们可能没有第二(预期)含义。当学生学习一个新的表达方式时,情况也是如此。如果这些表达方式含糊不清,很容易造成误解。因此,我想学生已经知道每个指令中都包含一个操作码部分。是的,我会说是真的。确实,问题01.的措词不明确。
HKOB

4
@SpehroPefhany是的,毫无疑问,这个问题是模棱两可的。如果OP被告知,无论指令长度如何,都将在第一次内存访问中获取操作码,则答案为(c),否则将无法回答。问题是,OP是否在他的 EE.SE问题中提供了足够的上下文,还是他的老师给出了理所当然的东西并提出了一个模棱两可的问题?
Lorenzo Donati-Codidact.org

1
@SpehroPefhany真:)但英语-也许是为了他们温和的烦恼-也是国际英语世界(部分bbc.com/capital/story/...
HKOB

4

您对这个问题感到困惑是正确的-它写得很差。

但是,我怀疑这个问题的目的是确定机器的指令字大小。考虑到所提供的数据非常不完整,这必须与数据总线的宽度相对应。地址总线的宽度决定了主存储器的最大容量。

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

老式的Motorola 68008就是一个很好的例子-它是68000的降低成本版本,带有8位数据总线,但它使用相同的16位指令字,其中通常7位确定操作码(其余标识源寄存器和目标寄存器以及寻址模式,所有这些都应视为操作数,而不是操作码)。如果像某些操作一样在操作码中包括寻址模式位,则总共将形成10位操作码字段。在某些寻址模式下,实际指令可能会更长。


“其余的标识源寄存器和目标寄存器,以及寻址模式,所有这些都应被视为操作数,而不是操作码”……好吧,这有点意见。对于RISC架构,这显然是正确的,但是在许多情况下,CISC架构是以一种临时的方式定义的,因此将每个组合算作一个单独的操作码可能是有意义的。Z80就是一个很好的例子-尽管其许多指令在操作码的位中都有一个或两个寄存器选择编码,但寻址模式完全是临时的,前缀改变了...的含义
Jules,

...在许多情况下都是寻址模式和寄存器,这使得从位域对寄存器的解释变得不那么简单。因此,大多数文档和汇编程序似乎都是在理解这一基础上工作的,因此,指令和寄存器的每种组合都是单独的操作码,并且实际上只有立即数和间接地址偏移量值才是操作数。这种世界观由其前身intel 8080所共享,在intel 8080中,标准汇编语言格式的寄存器通过一条编码为助记符一部分的指令(未提供为参数)进行操作。
朱尔斯

没错-Z80就是这种典型的8位微码CPU。6502具有更逻辑的操作码映射,可优化解码电路。但是我专门讲的是68K,它的指令中有非常不同的寻址模式和目标寄存器字段。减去这些后,操作码字段仍可以比68008的数据总线宽。
Chromatix

1

埃德森·德卡斯特罗(Edson DeCastro)设计的计算机几乎完全是PDP-8,它具有15条地址和12条数据线。

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


2
不知道为什么要投票否决票-鉴于问题本质上是毫无意义的,这与任何答案一样好。:)
朱尔斯(Jules)'18年

我怀疑投票否定是因为284 * 2 = 568,而不是574。–
标记
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.