代码之家  ›  专栏  ›  技术社区  ›  Victor Hurdugaci

减少指令的装配数量

  •  1
  • Victor Hurdugaci  · 技术社区  · 15 年前

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

    例如:

    pushl <reg1>
    popl  <reg1>
    

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

    或:

    pushl <something1>
    popl  <something2>
    

    将成为:

    movl <something1>, <something2>
    

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

    你能建议用更少的指令来代替其他类似的模式吗?

    以后编辑: 多亏了理查德·彭宁顿,我发现我想要的是窥视孔优化。

    因此,我将问题改为:Linux汇编代码上的窥视孔优化建议。

    3 回复  |  直到 8 年前
        1
  •  3
  •   Sedat Kapanoglu johnnywhoop    15 年前

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

    push reg1
    pop reg1
    

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

    这同样适用于其他优化:

    push some1
    pop some2
    

    通常只有当没有等价物时才会发出 movl some1, some2 指令。

    如果您试图优化高级编译器生成的代码,编译器通常会考虑其中的大部分情况。如果您试图优化本机编写的汇编代码,那么汇编程序员应该编写更好的代码。

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

        2
  •  1
  •   Richard Pennington    15 年前

    为了获得更多关于你想做什么的信息,你可能需要寻找“窥视孔优化”。

        3
  •  0
  •   Victor Hurdugaci    15 年前
    pushl <something1>
    popl  <something2>
    

    换成

    mov <something1>, <something2>
    

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

    你能提供一些其他可能的窥视孔优化吗?