为什么在编译时我们甚至需要汇编程序?

src*_*ode 2 compiler-construction assembly compiler-optimization

如果编译器将高级语言转换为机器代码,为什么我们甚至需要汇编程序呢?是否有任何汇编级语言,我们不能使用编译器?

Pet*_*des 5

为什么我们甚至需要汇编程序?

很多人不需要了解汇编语言.

它存在,因此我们可以更容易地讨论/分析机器代码,编写/调试编译器.

编译器必须由人类编写. 正如@old_timer指出的那样,在设计新的CPU架构时,您总是为操作码和寄存器指定名称,以便您可以与其他人讨论设计,并发布可读的手册.

或者对于OS开发,编译器无法生成一些特殊的特权指令.而且你不能编写一个上下文切换功能来保存纯C中的寄存器.

CPU直接运行机器代码而不是高级语言,因此计算机安全/利用以及任何严重的性能分析/调整都需要查看CPU运行的指令.操作码的助记符名称对于思考和编写它们非常有帮助. mov r32, imm32B8+rd imm32(该助记符的操作码范围)更容易记忆和更具表现力.


我经常使用asm来轻松创建我想要测试微基准测试的机器代码.编译器必须创建有效的机器代码,而不仅仅是正确的机器代码,因此人们常常使用asm来查看什么是快速的以及什么不是在各种CPU上.

请参阅http://agner.org/optimize/以及x86标记wiki中的其他性能链接.

例如,看到x86的MOV真的可以"免费"吗?为什么我不能重现这个呢?微融合和寻址模式,用于微基准测试的例子,以了解什么是快速的.

请参阅C++代码,以便比手写汇编更快地测试Collat​​z猜想 - 为什么?更多关于手工编写asm的信息比我手动控制gcc或clang更快,甚至通过调整C源来看起来更像我想出的asm.

(显然我必须知道asm能够查看编译器的asm输出并看看如何做得更好.编译器远非完美.有时甚至很远.错过优化错误很常见.想想新的优化并建议编译器寻找它们,就asm指令而言,比机器代码更容易思考.)

错误的代码编译器错误有时也会发生,并且验证它们基本上需要查看编译器输出.


Stack Overflow有几个问题,比如"什么更快:a++++a?",答案完全取决于它如何编译成asm,而不是源代码级语法差异.要理解为什么某些类型的源差异会影响性能,您必须了解代码如何编译为asm.

例如,添加冗余分配可在编译时加速代码而无需优化.(人们经常没有意识到有/无优化的编译不仅仅是线性加速,而且对未经优化的代码进行基准测试基本没有意义.未优化的代码有不同的瓶颈......如果你看一下这很明显ASM).