2

我想知道以下几点:

是否可以创建一小组汇编指令,它们可以一起完成所有可能的操作?或者可能会问不同的问题,关于任何架构的必备汇编指令是什么?

(例如,任何事情都需要 Jump 和 Add)

我希望你们能帮助我!

提供一些背景信息:我正在尝试为我的编译器设计一种中间语言,并且我想使用尽可能少的指令(然后,这些指令中的一堆指令可以代替特定架构的一个复杂指令)。当然,IL 本身应该是可移植的。

4

2 回答 2

3

我想你想要相反的。与其制作一个尽可能简单的 IL,不如打造一个极具表现力的 IL。IL 越具有表现力,就越容易针对特定架构进行优化。

将一个复杂的 IL 操作扩展为许多单独的指令比将许多简单的 IL 操作合并为一个复杂的指令更容易。您可能不需要乘法,因为它可以通过跳转和添加指令来完成。但是,当您为具有硬件乘法的芯片进行编译时,您必须分析 IL 以确定这是一个“加法循环”并将其转换回乘法。这比遇到乘法并说“嗯,这种架构不能做到这一点,我想我们必须使它成为一个加法循环”要多得多。

另一个例子,你可能认为你的 IL 不需要浮点运算,因为一些 ARM 芯片无论如何都必须在软件中进行浮点运算。但是一些 ARM 芯片不必这样做,如果您的 IL 不支持 FP 操作,那么您需要将复杂的软件 FP IL 转换回单个硬件指令。

最好将您的 IL 与最先进和最复杂的硬件功能相匹配,然后在没有这些功能的处理器上“回退”到这些功能的“软件仿真”。

于 2014-01-25T16:11:24.017 回答
2

最少是一条指令,甚至在碳纳米管计算机MAXQ芯片中实现

虽然只有一个就足够了,但实际上它比你想象的要复杂得多,而且通常需要更多的指令来完成同样的工作。如果您需要芯片的速度“可用”,那么 IMO 它应该至少有一些通用指令:

  • 1条条件跳转指令:等于(或不等于)跳转
  • 1 SUB 算术指令。这样,您可以轻松地进行加法和减法,而无需否定指令
  • 1 条按位指令:NAND(或 NOR),使用其中之一,您可以执行所需的任何逻辑操作
  • 1 MOV 指令
  • 1条加载/存储指令

使用子指令或按位指令,您可以移动数据,因此取决于您的架构和操作码大小,您可以删除 MOV 或加载/存储以进一步简化它。

于 2014-01-25T16:23:56.920 回答