2

1000hフロッピーの一部にあるコンテンツを起動するブートローダーを構築しています。私はFasmを使用してそれを行っていました(私の友人は Fasm しか使用しておらず、彼はこれを手伝ってくれていたので)、私はNasmを使用することを好み、今は構文に問題があります。どうすればよいか知りたいです。これはNasmで:

org 7C00h
    %include "boot.asm"

org 1000h
    %include "kernel.asm"

PS: 私はすでに%includeNasm 構文スタイルを使用してディレクティブを配置しています。Fasm では、include.

4

3 に答える 3

4

あなたの問題の説明や、質問から判断するのは少し難しいので、私が思うことについては、ここを参照してください。「構文に問題があります」という質問を投稿するときは、構文の問題何であるかを実際に示すことをお勧めします:-)

解決策については、ここを参照してください(ただし、機能しない場合があります。以下を参照してください)。

基本的に、orgNASMのステートメントは、セクションのベースアドレスを設定するためのものであり、ストリームにバイトを任意に挿入するために使用することはできません。次のようなものを使用することをお勧めします。

org 1000h
%include "kernel.asm"
times 7c00h-($-$$) db 0 ; pad it out with zero bytes
%include "boot.asm"

しかし、あなたは自分がやろうとしていることについて考えましたか。メモリにロードするフラットバイナリファイルを作成している場合は、ブートセクターとカーネルの両方を1つのファイルにまとめる必要はないと思います。

BIOSは、ブートセクターを7c00:0に単一のチャンクとしてロードする必要があり、そのチャンクの開始時にカーネルがある場合、ほぼ確実に混乱します。あなたがする必要があるのは、2つの完全に別々のフラットバイナリファイルを作成することだと思います。1つはブートセクター用で、もう1つはカーネル用です。BIOSがブートセクターをロードし、次にブートセクターがカーネルをロードします。

次に、関連するステートメントを2つのソースファイルに入れることができorg、問題が解決されることを願っています。

于 2010-06-28T01:50:31.007 に答える
1

簡単な答えは、NASM ではこれを行うことができないということです。このorgステートメントは、NASM と同じように FASM で機能しますが、MASM では異なります。NASM では、サンプル コードを個別にアセンブルしてから組み合わせて、最終的なイメージを作成する必要があります。

幸いなことに、これは、異なる開始アドレスを持つコードを (NASM を使用して) 組み合わせたり、(FASM を使用して) 1 つのイメージにアセンブルしたりする必要があるまれな (そしておそらく唯一の) ケースです。ブート セクタは7C00h、BIOS によって転送されます。メディア (フロッピー ディスク、ハード ドライブ、USB フラッシュ ドライブ) では、ブート セクタ (ブート ローダー) によってその開始アドレスに転送されるペイロードがすぐに続きます。

于 2010-08-24T23:29:33.470 に答える