汇编语言和优化

Zia*_*man 5 optimization assembly

如何在汇编编程中帮助实现优化

poo*_*lie 14

汇编编程最有可能改进代码的方法是改进:教你更多地了解低级别的情况,并获得优化的规则可以帮助你在更高级别的语言中做出正确的决策.

至于实际帮助一个程序:正如其他人已经指出的那样,它很少值得.您可以将它用作一种高级配置文件驱动的优化:尝试多种变体,直到找到最适合您特定问题的变体.

首先要做的是:用C或C++编写一个程序或者你通常使用的任何编译语言,启动你的调试器,并反汇编一个小但非常重要的函数,并考虑编译器为什么会这样做.然后尝试自己编写一小部分内联汇编程序.在现代系统中,装配很容易嵌入C中,而不是从头开始.

或者,像PIC这样的小机器,让它闪烁一个LED ...


Jos*_*hua 7

这些天,你必须非常善于组装以击败编译器.

我可以在一周的任何一天做到这一点,但只能先查看编译器的输出.

然后,如果它获得超过几个百分点,我会感到惊讶.

这些天,当我正在做编译器无法做的事情时,我只在程序集中编程.


Jay*_*Jay 5

原则上,您可以在汇编中编写高度优化的代码,因为编译器仅限于应用于许多程序的特定通用优化,而您可以创造性地使用您对此特定程序的了解.

举一个简单的例子,当我刚接触这个业务时,编译器在优化寄存器使用方面的能力非常有限.您知道要执行任何类型的算术或逻辑运算,CPU通常必须将其中一个值加载到寄存器中,然后在另一个上执行操作,然后保存结果?喜欢将两个数字加在一起 ​​- 我将在这里使用伪汇编程序,因为我不知道你知道哪种汇编语言,而且我自己也忘记了大部分细节 - 你会写这样的东西:

LOAD A,value1
ADD A,value2
STORE a,destination
Run Code Online (Sandbox Code Playgroud)

用于为每个操作生成负载的编译器.所以如果你的C程序说:

 x=x+y;
 z=z+x;
Run Code Online (Sandbox Code Playgroud)

编译器将生成如下内容:

LOAD A,x
ADD A,y
STORE A,x
LOAD A,z
ADD A,x
STORE A,z
Run Code Online (Sandbox Code Playgroud)

但是人类可以观察到,当我们到达第二个语句时,寄存器A已经包含x,并且加法是可交换的,因此我们可以将其优化为:

LOAD A,x
ADD A,y
STORE A,x
ADD A,z
STORE A,z
Run Code Online (Sandbox Code Playgroud)

等等.人们可以经历各种微小的微观优化.在我年轻的时候,我曾经一直这样做,世界是绿色的.

但是多年来编译器变得更加智能,并且CPU变得更加强大,因此微优化并不重要.

因此,我还没有编写任何汇编语言代码,哇,大概15年.我曾经在调试时读取编译器生成的汇编,有时它会给出一个微妙问题的线索,但我现在也没有这么做了.

我不认为编译器甚至不再用汇编编写.相反,你在其他计算机上用高级语言编写编译器的初稿,即你编写一个交叉编译器来让自己开始.

我怀疑今天唯一真正使用的装配是针对极端受限的环境,嵌入式系统等等; 以及必须与硬件密切配合的程序,如设备驱动程序.

我有兴趣听听这个论坛上是否有任何汇编程序员关心告诉我们汇编程序员的原因.