如果您要构建一个可用于运行任意程序的处理器,您可以使用的最少指令集 (ISA) 是多少?
我刚在想:
ALU-ops (add, sub, mul, div)
加载注册,[地址]
商店注册,[地址]
分支如果操作。如果不相等,则可能有分支,如果>,如果<(branchif reg1,reg2,LABEL)
你怎么看?
如果您要构建一个可用于运行任意程序的处理器,您可以使用的最少指令集 (ISA) 是多少?
我刚在想:
ALU-ops (add, sub, mul, div)
加载注册,[地址]
商店注册,[地址]
分支如果操作。如果不相等,则可能有分支,如果>,如果<(branchif reg1,reg2,LABEL)
你怎么看?
从技术上讲,您只需要一个指令。它需要进行数学和条件分支。例如,如果为负,则减去和分支。
您不需要任何可以从其他指令构建的指令。
所以,不需要mul
或者div
因为你可以通过重复的加法或减法来做到这一点,也不需要sub
如果你有neg
(negate) 并且数字会换行,例如使用二进制补码。
当然,您可以使用两条分支指令,一条等于,一条小于 - 所有其他指令都可以从这些指令的组合中构建。
因为您没有 I/O 指令,您可能需要使用内存映射 I/O,其中与其他设备的通信是通过内存访问进行的。
而且,如果没有本机push
and pop
,您可能需要使用专用寄存器(和内存位置,因为您似乎没有寄存器到寄存器的移动)来实现自己的堆栈。
现在这将不是一个非常好的架构,但它应该可以运行。正如 Matrix Architect 所说,“我们已经准备好接受某些生存水平”。
顺便说一句,看看 RCA1802 CPU(从以前的日子开始)。它没有专用的程序计数器或堆栈指针,而是在软件中实现所有这些(有关详细信息,请参见此处)。
在 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(如果设置了零标志则跳转)
注意:我意识到在寄存器之间复制数据的附加指令非常有用。但可以省略。请举一个没有它就不行的案例。