在同一架构上进行动态重新编译

时间:2016-09-12 20:58:54

标签: assembly compilation

我知道动态重新编译可用于在执行期间将一个体系结构的指令转换为另一个体系结构。但它可以用于优化同一架构上的程序吗?如果我编写一个优化不佳的汇编语言程序,我可以使用动态重新编译器使其运行速度比原生速度快吗?

2 个答案:

答案 0 :(得分:0)

我不知道这样的工具,不太可能存在,甚至更不可能提高已经原生程序的速度。

另一方面,现实可以做些什么:

  1. 使用IDAPro或其他
  2. 反汇编程序
  3. 识别代码&数据部分(这很重要且乏味)
  4. 另存为ASM
  5. 尝试使用打开所有优化的好汇编程序组装它
  6. 您甚至可以尝试分析程序,添加新功能,并在您(几乎)拥有源时手动优化事物
  7. 第2步是至关重要的,因为当优化器打开时,未能这样做(将数据标记为真实数据)对程序来说是致命的:优化器会将数据解释为指令并优化它们,从而产生不同的数据!

    当然,未能将代码识别为真正的代码不会成为问题,但您将无法更有效地重新组装代码。

    当优化不合格或不合适时,该方法可以帮助改进旧的C编译程序。但是一项好工作需要手动识别程序浪费时间的部分。汇编程序只能执行本地优化。

答案 1 :(得分:0)

创建运行速度比本机速度快的代码是不可能的,因为最快的代码仍然只能以原生速度运行。 :)

如果你的意思是比原始代码更快,那么是的,可以创建具有这种目的的工具,但要使它变得实用和成功将非常困难。

推理:

使用C ++等本机编译语言,通过编译原始源代码,编译器有很多关于程序员原始意图的强烈暗示,并且它们的优化器可以更具攻击性,而不是盲目地将char中的所有char转换为机器代码,但是只产生符合语言定义的代码(即省略整个函数调用,不使用结果,并且没有函数执行的副作用)。

一旦您尝试仅优化本机机器代码本身,您就不会拥有其他上下文。因此,您的新优化代码必须模仿每个方面的原始代码,直至所有副作用和内存修改。

此时,您只需进行一些非常小的优化,例如寄存器重新分配,指令重新排序,偶尔使用更快的替代方案替换指令等等。

现代的x86 CPU在执行过程中实际上已经完成了很多工作,因为x86原始类似CISC的指令集并没有直接在芯片上实现,但是它被转换为内部类似RISC的微处理器-instructions,寄存器被别名,所有东西都被重新排序,在可能的情况下并行执行,分支预测推测性提前等等...现代x86 CPU就像机器中的机器,所以它实际上可能做了一半你的方法本身有什么可能。

另一半可能很难为程序计算,因此以您的方式设计的工具可能只是保存内部x86优化的麻烦,使得机器代码更适合平台友好,但只获得额外的性能。