1

我想(手动)减少 Linux 汇编文件中的指令数量。这将基本上通过在抽象语法树中搜索预定义的缩减来完成。

例如:

pushl <reg1>
popl  <reg1>

将被删除,因为它没有任何意义。

或者:

pushl <something1>
popl  <something2>

会变成:

movl <something1>, <something2>

我正在寻找涉及固定数量指令的其他优化。我不想搜索指令的动态范围。

你能推荐其他可以用更少指令替换的类似模式吗?

后来编辑:感谢 Richard Pennington,我发现我想要的是窥视孔优化。

所以我把这个问题改写为:关于 Linux 汇编代码的窥孔优化建议。

4

3 回答 3

3

编译器已经做了这样的优化。此外,进行此类优化并不是那么简单的决定,因为:

push reg1
pop reg1

仍将 reg1 的值留在内存位置 [sp-nn](其中 nn = reg1 的大小,以字节为单位)。因此,尽管 sp 超过了它,但后面的代码可以假设 [sp-nn] 包含 reg1 的值。

这同样适用于其他优化:

push some1
pop some2

这通常仅在没有等效movl some1, some2指令时才会发出。

如果您尝试优化高级编译器生成的代码,编译器通常会考虑大多数情况。如果您正在尝试优化本机编写的汇编代码,那么汇编程序员应该编写更好的代码。

我建议您优化编译器,而不是优化汇编代码,它会为您提供更好的框架来处理代码的意图和寄存器使用等。

于 2009-11-28T15:56:41.943 回答
1

要获取有关您尝试执行的操作的更多信息,您可能需要查找“窥视孔优化”。

于 2009-11-28T16:05:25.200 回答
0
pushl <something1>
popl  <something2>

替换为

mov <something1>, <something2>

实际上增加了我的程序的大小。奇怪的!

您能否提供一些其他可能的窥视孔优化?

于 2009-12-11T10:21:27.553 回答