我有一段使用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