2013-02-11 47 views
3

我有一段使用JNZ的代码。当我汇编和链接二进制文件时,我看到我的JNZ被替换为JNE。我明白他们两人基本上是一样的。但那为什么NA​​SM会改变它呢?NASM在组装时将JNZ更改为JNE?为什么?

另外,是否有任何可用的配置选项来阻止组装时发生这种变化?

+1

花些时间阅读CPU文档。 JE和JZ是一回事。 JNE和JNZ也是如此。 – 2013-02-11 06:57:37

+0

我们为什么需要它们两个? – 2013-02-11 09:24:51

+0

为什么我们有同义词,别名,昵称等?他们有一定的目的。 'ADD AX,1'后面有什么更自然的想法,'平等'或'零'?现在,回答“CMP AX 1”的相同问题。 – 2013-02-11 09:33:37

回答

9

据我所知,他们两人根本上是相同的

JNEJNZsame opcodes(近跳跃0x75短期的跳跃和0x0f 0x85),所以汇编程序将创建同一台机器代码为他们两个。

拆解时,反汇编人员不知道哪一个在源代码中被使用过,而且必须使用其中的一个。

此外,是否有任何可用的配置选项来阻止组装时发生这种变化?

没有,因为它不是一个真正的“替代品” - JNEJNZ只是为同一操作码不同的助记符。

+0

我的下一个问题是为什么需要他们两个? – 2013-02-11 09:22:34

+3

你可以使用它们使你的代码更易读易懂 - 使用'JNE'后跟一个'CMP'指令来表明你正在检查** equal **,如果你只是想要使用'JNZ'检查零标志(例如,在检查结果是否为零的SUB指令之后) – 2013-02-11 09:28:51

+0

我的意思是当JNE ** **在** CMP之后,当然...... – 2013-02-11 09:57:52

1

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

相关问题