【问题标题】:NASM changes JNZ to JNE while assembling? Why?NASM 在组装时将 JNZ 更改为 JNE?为什么?
【发布时间】:2013-01-26 06:04:36
【问题描述】:

我有一段使用 JNZ 的代码。当我组装和链接二进制文件时,我看到我的 JNZ 被 JNE 替换。据我了解,它们两者基本上是相同的。但是为什么 NASM 会改变它呢?

另外,是否有任何配置选项可用于阻止在组装时发生这种更改?

【问题讨论】:

  • 花点时间阅读 CPU 文档。 JE和JZ是一回事。 JNE 和 JNZ 也是如此。
  • 为什么我们都需要它们?
  • 为什么我们有同义词、别名、昵称等?它们服务于某种目的。 EqualityZeroADD AX, 1 之后更自然地想到什么?现在,为CMP AX, 1 回答同样的问题。
  • 我很惊讶地看到您自己可以轻松找到答案的缺乏努力。

标签: assembly x86 nasm disassembly


【解决方案1】:

我知道两者本质上是相同的

JNEJNZ 具有 same opcodes0x75 用于短跳转,0x0f 0x85 用于近跳转),因此汇编程序将为两者创建 相同的机器代码他们。

反汇编时,反汇编程序不再知道源中使用了哪一个,它必须取其中一个。

另外,是否有任何配置选项可用于阻止在组装时发生这种更改?

不,因为它不是真正的“替换” - JNEJNZ 只是相同操作码的不同助记符。

【讨论】:

  • 我的下一个问题是,为什么两者都需要?
  • 您可以使用它们使您的代码更具可读性和更易于理解 - 使用 JNE 后跟 CMP 指令来明确您正在检查平等 , 如果您只是想检查零标志(例如在 SUB 指令后检查结果是否为零),请使用 JNZ
【解决方案2】:

JNZJNE 具有完全相同的编码(请参阅英特尔® 64 和 IA-32 架构软件开发人员手册第 2A 卷 3-419)。因此,无论您在汇编器中使用哪一个,反汇编器都会选择一个并在整个反汇编代码中使用相同的符号。

【讨论】:

    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 2016-06-01
    • 2019-05-30
    • 1970-01-01
    • 2013-01-28
    • 2023-04-06
    • 2012-09-30
    • 2020-10-04
    相关资源
    最近更新 更多