Assembly 同一体系结构上的动态重新编译

Assembly 同一体系结构上的动态重新编译,assembly,compilation,Assembly,Compilation,我知道动态重新编译可以用于在执行期间将一个体系结构的指令转换为另一个体系结构。但是它可以用来优化同一体系结构上的程序吗?如果我写的汇编语言程序优化得很差,我可以使用动态重新编译程序使其运行速度快于本机速度吗?我不知道有这样的工具,它不太可能存在,甚至更不可能提高本机程序的速度 另一方面,可以现实地做些什么: 使用IDAPro或其他工具反汇编程序 识别代码和数据部分(这既重要又繁琐) 另存为ASM 试着在所有优化都打开的情况下用一个好的汇编程序来组装它 您甚至可以尝试分析程序,添加新功能,并在(几

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

我不知道有这样的工具,它不太可能存在,甚至更不可能提高本机程序的速度

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

  • 使用IDAPro或其他工具反汇编程序
  • 识别代码和数据部分(这既重要又繁琐)
  • 另存为ASM

  • 试着在所有优化都打开的情况下用一个好的汇编程序来组装它
  • 您甚至可以尝试分析程序,添加新功能,并在(几乎)拥有源代码后手动优化内容
  • 第2步至关重要,因为如果不这样做(将数据标记为真实数据),当optimizer打开时,将对程序造成致命影响:optimizer将把数据解释为指令并对其进行优化,从而产生不同的数据

    当然,无法将代码识别为真实代码的问题会少一些,但您将失去更有效地重新组装代码的能力


    这种方法可以帮助改进,比如说,在优化未启动或不太好的情况下,旧的C编译程序。但是一项好的工作需要手动识别程序浪费时间的部分。汇编程序只能执行局部优化。

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

    如果您的意思是“比原始代码快”,那么是的,创建具有这种目的的工具是可能的,但要使其实用和成功将非常困难

    理由:

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

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

    在这一点上,您只需要进行一些非常小的优化,比如寄存器重新分配、指令重新排序、偶尔使用更快的替代方案进行少量指令替换等

    现代x86 CPU实际上在执行过程中自己做了很多这方面的工作,因为x86原始的类似CISC的指令集并没有直接在芯片上实现,但它被转换成类似RISC的内部微指令,寄存器被混叠,所有内容都被重新排序,在可能的情况下并行执行,并带有分支预测一个现代的x86CPU就像机器中的机器,所以它实际上只完成了您的方法中可能完成的一半


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

    这是JIT编译器或后期AOT编译器背后的想法之一(即,当它到达用户系统时进行编译,但不是在之前)。我模糊地记得在某个地方读到过关于这个正在进行实验的文章。但我不知道它是否超出了这一范围。从本机体系结构到本机体系结构的动态重新编译确实在各种软件PC仿真器(如DOSBox或QEMU)的实践中发生但是程序并没有因此运行得更快。“所有优化都打开的好的汇编程序”……嗯,我认为任何经典汇编程序都没有任何严重的优化。它们倾向于将编写的汇编程序1:1编译成机器代码指令(除了一些类似宏的扩展,但作为程序员,您总是可以通过只读取源代码准确地猜测生成的机器代码,因此不涉及“智能”)。不是这样,我看到一些编译器生成东西(68000)比如
    move.l#0,D0
    其中
    moveq#0,D0
    将更短更快。处理这些行的汇编程序可以进行替换。但这可能是一个小问题。编译器和汇编程序是两个不同的软件。我可以很容易地看出编译器是如何尽可能多地进行优化的,但我不会使用它具有此类功能的g汇编程序(没有完全控制)。如果您在.asm“move.l”中编写,它应该编译为“move.l”,而不是“move.q”。大多数68k汇编程序在启用优化时都会这样做。您可以启用这样或那样的优化。他们也会在不需要时终止分支(无条件分支到下一条指令),调整分支大小等…但也许我是从68k的角度讲的,它不太适用于英特尔体系结构。