2013-02-11 48 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頁)。因此,無論您在彙編程序中使用什麼,反彙編程序都會選擇一個,並在反彙編代碼中使用相同的符號。

相關問題