MASM会改变你背后的指示吗?

时间:2011-09-29 19:20:49

标签: assembly x86 x86-64 masm

阅读HLA faq时,我对以下内容感到惊讶:

  

MASM有一个讨厌改变你的指示的恶习           背部。 HLA似乎也有同样的问题。

然后我在网上搜索但没有发现任何相关信息。它是真的还是只是一个神话?

4 个答案:

答案 0 :(得分:2)

MASM可以改变你的想法。例如,它可以修复条件跳转。那就是你写的:

    add ax,bx
    jnz NotZero

    ...
NotZero:

如果NotZero超出了条件跳转的范围,MASM可以将您的代码重写为:

    add ax,bx
    jz Zero
    jmp NotZero
Zero:
    ...
NotZero:

我记得,有一些命令行开关可以防止这种情况发生。你也可以专门说jnz near NotZero来阻止它。如果你这样做并且目标超出了条件范围,你就会收到错误。

我记得MASM做过其他类似的事情,但这已经很长时间了。我不记得那些具体的东西是什么。

答案 1 :(得分:1)

这可能不是您正在寻找的,但我遇到过MASM不会为与其他类似汇编程序(例如NASM)相同的输入生成相同输出的情况。也就是说,一个稍微不同的字节序列可以分解为同一个东西。

通常情况下,它根本不是问题,我注意到它的唯一原因是因为一个奇怪的情况我需要指令中的某些位作为特定值;有一个汇编程序它很好,而另一个,它不是,我不得不应用手动修复。

希望有所帮助。

答案 2 :(得分:1)

这有点半真。一些指令可以以多种方式编码,有时(由于他们从未解释过的原因),Microsoft已经改变了对一些特定指令进行编码的方式。

从版本6开始,它还有一个多次通过模式,它可以/将使用将“到达”目的地的最小形式的跳转来编码跳跃。在5.x之前,您必须手动指定近距离和远距离跳跃,如果您猜错了,则在第二次传递时会产生“相位误差”。从v6开始,它会自动调整大小。由于这会改变指令的大小,这也会迫使其他周围的跳转也发生变化(同样,在另一个方向上,跳转的较小编码可能会减少代码大小,使得另一个跳转可以通过较小的编码到达其目的地)。

然而,从大多数人的角度来看,不是是一种“讨厌的习惯” - 恰恰相反,大多数人都喜欢尽可能有效地自动编码指令。有一些情况(例如,自我修改代码)你需要阻止它,但那些通常被认为是“讨厌的习惯”(至少如果你真的习惯性地这样做)

答案 3 :(得分:0)

我认为这种“改变”是关于指令调度和窥视孔优化。当您使用“cat> pgm.o”编写代码时,可以将其转义。