2013-01-21 127 views
0

TEST.ASM:位NASM 16和位32

org 0100h 
[BITS 16] 
mov eax, 0 
[BITS 32] 
mov eax, 0 

然後編譯和拆卸如下:

nasm test.asm -o test.com

ndisasm -o 0x0100 test.com

結果:

00000100 66B800000000  mov eax,0x0 
00000106 B80000   mov ax,0x0 
00000109 0000    add [bx+si],al 

那麼從結果中我們可以看出[BITS 16]使用eax,[BITS 32]使用ax,爲什麼?結果應該翻轉嗎?

+0

當你混合使用16位和32位代碼時,混淆不就是ndisasm嗎? 'B800000000'將在32位模式下爲'mov eax,0'。 –

回答

5

.com文件基本上是一個二進制塊的代碼(和數據)。它沒有任何有關其內部的高級信息。因此ndisasm無法分辨它是否應以16位或32位模式進行反彙編,並且默認爲16位。如您所見,這確實會爲「BITS 16」部分產生正確的結果,但以下代碼已被組裝爲32位代碼,但ndisasm仍將其拆分爲16位,因此是垃圾輸出。如果指定「-b 32」,你會看到被正確拆卸部分:

>ndisasm.exe -b 32 -o100h test.com 
00000100 66B80000   mov ax,0x0 
00000104 0000    add [eax],al 
00000106 B800000000  mov eax,0x0 

總之,ndisasm確實你告訴它什麼,你它想不算什麼。由於採用.com格式,因此無法判斷給定的一堆字節是16位還是32位代碼,或者甚至只是數據,因此您需要提供幫助。

0

我的猜測是你需要關閉優化。

即使用-o0標誌。

Optimization on by default since version 2.0.9

奇怪,雖然我很驚訝它沒有使用XOR EAX,EAX招將其設置爲0,因爲它使用的是更快的。

+0

不是更快,但'XOR ax,ax'只是一個字節。 –

+0

,但在命令中添加'-O0'無助於更改結果。 – Searene

+0

Nasm對「優化」做了什麼嚴重的誤解。這裏不會做任何事情。 –