我有一段使用JNZ的代码。当我汇编和链接二进制文件时,我看到我的JNZ被替换为JNE。我明白他们两人基本上是一样的。但那为什么NASM会改变它呢?NASM在组装时将JNZ更改为JNE?为什么?
另外,是否有任何可用的配置选项来阻止组装时发生这种变化?
我有一段使用JNZ的代码。当我汇编和链接二进制文件时,我看到我的JNZ被替换为JNE。我明白他们两人基本上是一样的。但那为什么NASM会改变它呢?NASM在组装时将JNZ更改为JNE?为什么?
另外,是否有任何可用的配置选项来阻止组装时发生这种变化?
据我所知,他们两人根本上是相同的
JNE
和JNZ
有same opcodes(近跳跃0x75
短期的跳跃和0x0f 0x85
),所以汇编程序将创建同一台机器代码为他们两个。
拆解时,反汇编人员不知道哪一个在源代码中被使用过,而且必须使用其中的一个。
此外,是否有任何可用的配置选项来阻止组装时发生这种变化?
没有,因为它不是一个真正的“替代品” - JNE
和JNZ
只是为同一操作码不同的助记符。
我的下一个问题是为什么需要他们两个? – 2013-02-11 09:22:34
你可以使用它们使你的代码更易读易懂 - 使用'JNE'后跟一个'CMP'指令来表明你正在检查** equal **,如果你只是想要使用'JNZ'检查零标志(例如,在检查结果是否为零的SUB指令之后) – 2013-02-11 09:28:51
我的意思是当JNE ** **在** CMP之后,当然...... – 2013-02-11 09:57:52
JNZ
和JNE
具有完全相同的编码(请参阅英特尔®64和IA-32架构软件开发人员手册第2A 3-419页)。因此,无论您在汇编程序中使用什么,反汇编程序都会选择一个,并在反汇编代码中使用相同的符号。
花些时间阅读CPU文档。 JE和JZ是一回事。 JNE和JNZ也是如此。 – 2013-02-11 06:57:37
我们为什么需要它们两个? – 2013-02-11 09:24:51
为什么我们有同义词,别名,昵称等?他们有一定的目的。 'ADD AX,1'后面有什么更自然的想法,'平等'或'零'?现在,回答“CMP AX 1”的相同问题。 – 2013-02-11 09:33:37