1

如果您要构建一个可用于运行任意程序的处理器,您可以使用的最少指令集 (ISA) 是多少?

我刚在想:

  • ALU-ops (add, sub, mul, div)

  • 加载注册,[地址]

  • 商店注册,[地址]

  • 分支如果操作。如果不相等,则可能有分支,如果>,如果<(branchif reg1,reg2,LABEL)

你怎么看?

4

3 回答 3

5

从技术上讲,您只需要一个指令。它需要进行数学和条件分支。例如,如果为负,则减去和分支。

于 2012-06-26T06:02:47.540 回答
1

您不需要任何可以从其他指令构建的指令。

所以,不需要mul或者div因为你可以通过重复的加法或减法来做到这一点,也不需要sub如果你有neg(negate) 并且数字会换行,例如使用二进制补码。

当然,您可以使用两条分支指令,一条等于,一条小于 - 所有其他指令都可以从这些指令的组合中构建。

因为您没有 I/O 指令,您可能需要使用内存映射 I/O,其中与其他设备的通信是通过内存访问进行的。

而且,如果没有本机pushand pop,您可能需要使用专用寄存器(和内存位置,因为您似乎没有寄存器到寄存器的移动)来实现自己的堆栈。

现在这将不是一个非常好的架构,但它应该可以运行。正如 Matrix Architect 所说,“我们已经准备好接受某些生存水平”。


顺便说一句,看看 RCA1802 CPU(从以前的日子开始)。它没有专用的程序计数器或堆栈指针,而是在软件中实现所有这些(有关详细信息,请参见此处)。

于 2012-06-26T05:45:45.463 回答
1

在 8085 中编程时,我觉得有几种方法可以做同样的事情。所以,如果是这种情况,你就知道你的指令集不是最小的。

我建议遵循以下说明 - 添加、补充、逻辑与、或和加载存储。有条件和无条件跳转。

大多数其他指令都可以使用上述指令执行。


编辑:仅列出组装说明(基于 8085):

我将考虑一个模型,其中有 3 个寄存器。像 A = B + C 这样的操作

ADD B, C (A = B + C)
CMA (A = A')
OR B, C (A = B OR C) JMP xxxx(将 PC 设置为 xxxx)
LDA xxxx(在 xxxx 地址加载 A 内容)
STA xxxx
JZ xxxx(如果设置了零标志则跳转)

注意:我意识到在寄存器之间复制数据的附加指令非常有用。但可以省略。请举一个没有它就不行的案例。

于 2012-06-26T06:08:12.663 回答