Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 中间语言的最小汇编指令集?_Assembly_Compiler Construction_Intermediate Language - Fatal编程技术网

Assembly 中间语言的最小汇编指令集?

Assembly 中间语言的最小汇编指令集?,assembly,compiler-construction,intermediate-language,Assembly,Compiler Construction,Intermediate Language,我想知道的是: 是否可以创建一组小的组装说明,这些说明一起可以完成所有可能的操作?或者可能会有不同的问题,关于任何体系结构,必须有哪些组装说明 (例如,任何事情都需要跳转和添加) 我希望你们能帮助我 提供一些背景信息:我正在尝试为我的编译器设计一种中间语言,并且我希望使用尽可能少的指令(之后,对于特定的体系结构,一组指令可以替换为一条复杂指令)。当然,IL本身应该是可移植的。我想你想要的恰恰相反。与其制作尽可能简单的IL,不如制作一个非常有表现力的IL。IL的表现力越强,就越容易针对特定的体系结

我想知道的是:

是否可以创建一组小的组装说明,这些说明一起可以完成所有可能的操作?或者可能会有不同的问题,关于任何体系结构,必须有哪些组装说明

(例如,任何事情都需要跳转和添加)

我希望你们能帮助我


提供一些背景信息:我正在尝试为我的编译器设计一种中间语言,并且我希望使用尽可能少的指令(之后,对于特定的体系结构,一组指令可以替换为一条复杂指令)。当然,IL本身应该是可移植的。

我想你想要的恰恰相反。与其制作尽可能简单的IL,不如制作一个非常有表现力的IL。IL的表现力越强,就越容易针对特定的体系结构进行优化

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

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

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

最低限度是,甚至在或中实际实现了

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

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

使用子指令或按位指令,您可以移动数据,因此根据您的体系结构和操作码大小,您可以删除MOV或加载/存储以使其更简单。

当然有“最小所需集”的概念。许多CPU都是围绕“微码”的概念设计的,在这个概念中,您提供的机器指令实际上是作为CPU内部的“微码”例程执行的。微码是一组更基本、更小的操作。它实际上取决于您希望如何定义它,只要您获得所需的功能。作为编译器的中间语言,许多语言都有一个中间“pcode”。然而,“pcode”通常不在汇编级别。嗯,你能给我指出一个正确的方向,如何设计你自己的微码——中间语言吗?谢谢你的回答!我很高兴这次我的假设没有那么疯狂:这就是为什么编译器一次又一次地使用基于堆栈的中间代码来生成可移植字节码的原因,这种字节码可以很容易地针对任何系统。有一个技巧可以让你的IL最小化,同时能够满足特定于目标的功能(如FPU、SIMD等)-内在函数。嗯,感谢您的响应!还有一件事:如果使用的指令集最小,优化ILs不是更容易吗?@ChristianVeenman,许多指令并不是那么重要。更重要的是中间语言设计。某些属性,如SSA,对优化非常有用。注册机器比堆叠机器更容易优化(但后者更容易定位)。具有明确的基本块使所有优化更容易,但同样,以这种方式生成代码更难,也许您需要另一种中间语言。内部语言更容易处理,但它们会使inst.combine优化不那么透明(请参阅LLVM)。非常感谢!我会接受你的回答!但我能再问你一个问题吗?:正如另一条评论所说的那样,拥有一个复杂的IL更好。但是你同意吗?或者你认为一个最小的IL更适合优化吗?对于IL来说,它通常是复杂的,因为它无论如何都会被翻译成机器代码。相反,现在的机器指令集我们通常很简单,通过这种方式设计和快速制作每一条指令更容易。但是,只有在性能很重要的情况下,你才应该注意这一点,而且要将商业产品的一部分性能与相同的成本/硬件相匹配并不容易,因为它需要大量的工作和研究,所以越简单越好