2013-01-16 148 views
1

我是一個新手NASM,我想編譯這個小片段爲32位和64位代碼:NASM和DISASM問題與32/64位

pop bx 
ret 

獲得組裝0x5b 0xc3與「NASM。 exe文件asm.asm「。這應該是32位代碼(默認爲nasm),但是「ndisasm.exe asm -b 32」錯誤地將其反彙編爲pop ebx和ret。

bits 64 
pop bx 
ret 

被組裝到0x66 0x5b 0xc3與 「nasm.exe asm.asm」 和 「ndisasm.exe ASM -b 64」 正確地拆卸本流行BX和RET。

我在哪裏出錯?我很困惑現在

回答

3

這取決於您使用的輸出格式。如果您沒有使用-f foo指定輸出格式,則將使用默認輸出格式,通常爲bin,使用bin作爲輸出格式將選擇16位模式,除非另有明確規定BITS。 。

,因爲它說in the section 2.1.2 of NASM manual:「如果你不提供-f選項NASM,它會選擇一個輸出文件格式,你本身在NASM的分佈版本中,默認總是bin;如果」已經編譯了你自己的NASM副本,你可以在編譯時重新定義OF_DEFAULT並選擇你想要的默認值。「

因此,假設您尚未重新定義OF_DEFAULT,則默認情況下,nasm使用bin作爲輸出格式。

然後,in the section 7.1 of NASM manual它說以下內容:「該bin格式不產生目標文件:它會產生什麼輸出文件,除非你寫的代碼這樣的‘純二進制’文件是由MS-DOS使用:.COM可執行文件和.SYS設備驅動程序是純二進制文件,純二進制輸出對於操作系統和引導加載程序開發也非常有用。「 ... 「使用bin格式將NASM默認設置爲16位模式(請參閱第6.1節)。要使用bin編寫32位或64位代碼(例如OS內核),請需要明確發佈BITS 32BITS 64指令。「

然後,因爲它說in the section 6.1 of NASM manual:「在大多數情況下,你不應該需要使用BITS明確aoutcoffelfmachowin32win64目標文件格式,它是專爲使用32位。或64位操作系統,都會導致NASM默認分別選擇32位或64位模式。「

所以,這一切都取決於使用的輸出格式,除非明確定義了BITS

+0

謝謝你的工作,我將獎勵點給你,因爲你花時間在這個答案。順便說一句,我的答案也解決了我的問題。 –

+0

感謝您接受我的回答。我看到了你的答案,但因爲它不是全部真相(因爲通常是組裝一些對象格式,而不是一個平面二進制文件),我也一直在想自己的NASM輸出的16/32/64比特問題,我想更完整的解釋也可能對其他人有幫助。 – nrz

4

非常抱歉發佈了這個,但似乎nasm默認爲16位。

通過在32位代碼中使用「位32」,我解決了所有問題。