汇编语法区分两种形式的近跳转

时间:2013-07-15 20:03:35

标签: windows assembly x86 masm

我正在使用两个不同的汇编程序组装相同的源代码。我希望得到两个相同的结果(模数内存偏移,NOP的精确值等)。然而,我突然遇到了一个最奇怪的问题:JZ有两种可能的编码:

74 cb

0F 84 cw/cd

在我的情况下,位移适合一个字节,一个汇编程序(我认为是GAS的一种)发出前者而另一个(MASM)发出后者。由于我通过匹配输出执行一些验证,因此会关闭验证。

我对GAS的选项几乎没有控制权,但我完全控制了MASM。问题 - 是否有一个选项,一个指令或一个特定的命令语法来强制一个编码而不是另一个?

1 个答案:

答案 0 :(得分:0)

如果除了这一条指令之外的所有代码在组装时完全相同,这看起来像是MASM中的一个错误。这些说明解析为:

74: jz rel8
0F 84: jz rel16/32

因此,MASM不恰当地为该操作码使用了更多的空间。您可以通过在MASM中使用更明确的指令形式来解决这个问题,例如

jz byte my_label

但是,如果您的机器代码完全不同,则可能是MASM的正确的行为。确保jz rel16签名字/双字参数适合签名字节