3

test.asm:

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]use eax[BITS 32]use ax、なぜ? 結果はひっくり返す必要がありますか?

4

2 に答える 2

12

.com ファイルは、基本的にコード (およびデータ) のバイナリ チャンクです。内部に関する高レベルの情報はありません。そのndisasmため、16 ビット モードと 32 ビット モードのどちらで逆アセンブルする必要があるか判断できず、デフォルトで 16 ビットになります。ご覧のとおり、これは「BITS 16」部分の正しい結果を生成しますが、次のコードは 32 ビット コードとしてアセンブルされていますが、ndisasmまだ 16 ビットとして逆アセンブルされているため、ガベージ出力です。「-b 32」を指定すると、 2 番目の部分が適切に逆アセンブルされていることがわかります。

>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 ビット コードなのか、あるいは単なるデータなのかを判断する方法がないため、それを支援する必要があります。

于 2013-01-21T15:29:59.313 に答える
-1

私の推測では、最適化をオフにする必要があります。

つまり、-o0 フラグを使用します。

バージョン 2.0.9 以降、デフォルトで最適化がオンになっています

奇妙なことに、以前は高速だったので、XOR eax,eax トリックを使用して 0 に設定しなかったことに驚いています。

于 2013-01-21T14:59:40.040 に答える