1

私は nasm の初心者で、この小さなスニペットを 32 ビットと 64 ビットのコードにコンパイルしたいと考えていました。

pop bx
ret

「nasm.exe asm.asm」で 0x5b 0xc3 にアセンブルします。これは 32 ビット コード (nasm のデフォルト) である必要がありますが、「ndisasm.exe asm -b 32」は誤って分解してebxと ret をポップします。

しかし

bits 64
pop bx
ret

「nasm.exe asm.asm」および「ndisasm.exe asm -b 64」で 0x66 0x5b 0xc3 にアセンブルされ、これを正しく分解して bx をポップし、ret します。

どこが間違っていますか?私は今かなり混乱しています

4

2 に答える 2

4

これを投稿して申し訳ありませんが、nasm のデフォルトは 16 ビットのようです。

32ビットコードで「ビット32」を使用することで、すべてを解決しました。

于 2013-01-16T09:17:52.427 に答える
3

使用する出力形式によって異なります。で出力形式を指定しない場合-f foo、デフォルトの出力形式 (通常は ) が使用され、出力形式としてbin使用すると、特に明示的に定義されていbinない限り、16 ビット モードが選択されます。BITS

NASM マニュアルのセクション 2.1.2 にあるように、 「 NASM にオプションを指定しない-fと、出力ファイル形式が自動的に選択されます。NASM の配布バージョンでは、デフォルトは常にbinです。 NASM の独自のコピーをコンパイルした場合はOF_DEFAULT、コンパイル時に再定義して、デフォルトにしたいものを選択できます。」

したがって、 を再定義していないと仮定するとOF_DEFAULT、nasm はbinデフォルトで出力形式として使用します。

次に、NASM マニュアルのセクション 7.1 で次のように述べていbinます。デバイス ドライバーは純粋なバイナリ ファイルです。純粋なバイナリ出力は、オペレーティング システムとブート ローダーの開発にも役立ちます。.COM.SYS... "このbin形式を使用すると、デフォルトで NASM が 16 ビット モードになります(セクション 6.1 を参照) bin。OS カーネルなどの 32 ビットまたは 64 ビット コードを記述するために使用するには、BITS 32またはを明示的に発行する必要があります。BITS 64指令。"

次に、NASM マニュアルのセクション 6.1 にあるように、「ほとんど場合、明示的に使用する必要はありません。32BITSビットまたは64ビットのオペレーティング システムで使用するために設計された、、、、、およびオブジェクト形式、すべて NASM がデフォルトでそれぞれ 32 ビットまたは 64 ビット モードを選択する原因となります。"aoutcoffelfmachowin32win64

BITSしたがって、が明示的に定義されていない限り、すべては使用中の出力形式に依存します。

于 2013-01-16T11:39:32.357 に答える