3

最近、経験を積むために、アセンブリ コーディングを始めたいと思っています。私はそれを調べることにし、いくつかの良い結果を得ていました (単純な asm ですが)、すべてがまだぼやけており、複数の.asm ファイルを.. &.. & .. Oracle VMの.vfdまたは.imgファイルで終了します。

そのため、ここ数週間、暇なときに、次のことを可能にする作業方法を見つけようと Web を調べていました。

1. Compile my .asm files into individual .obj files
2. Link these multiple files into one .bin
3. Place this .bin into a .vfd or .img
4. Finally ran on the Oracle VM.

Windows 7 64 ビット システムで現在使用しているプログラムは次のとおりです。

(すべてMinGWを介して)

1. nasm   - to compile the asm to .obj / .bin files
2. ld     - to link .obj files into a .bin (I think)
3. dd     - to create a .img file from a .bin file

しばらくいじった後、単一の .asmファイル.bin ファイルにコンパイルし、それをddを使用して.imgに配置することができました(以下はオンラインのチュートリアルからのものです)。

(これらのコマンドを以下の順序で実行するバッチ ファイル)

1. nasm -f bin -o bootloader.bin bootloader.asm  
2. dd if=bootloader.bin of=output.img count=1440

そして、output.imgを読み取って正しく表示するOracle VMを実行しました。わーい。

今。私は数年前から Visual C++でコーディングしてきましたが、通常は単一のソリューションで多くのファイルを使用しています。asmでコーディングするときは、複数のファイルを持つこともできるはずだと感じています。だから私は読んだことがありますが、多くの人が「ld」を使用しています-.objファイルを.binファイルに「結合」するリンカーですか?

そこで、上記のbatファイルを次のように編集しました。

1a. nasm -f bin -o bootloader.bin bootloader.asm 
1b. nasm -f bin -o kernel.bin     kernel.asm 
2.  ld -o link.bin bootloader.obj kernel.obj 
3.  dd if=link.bin of=output.img  count=1440

最初に表示されたエラーは、「非 PE 出力ファイルに対して PE 操作を実行できません」というものでした。Googled.. およびGoogled ... およびGoogled .... およびGoogled ..... (次への 1 つのリンク) を行った後、機能する他の方法を見つけることができませんでした。エラーがさらに発生しました。私は正直迷っています。- いくつかの異なるプログラム (例: objcopy)、多くの異なるパラメーターなどを試しましたが、あまり進歩していません。案内が必要です。:)

そして、これが私の最後の質問です。これらのファイルldと一緒に「リンク」すると、求める結果が得られますか? (複数のファイルが 1 つの最終的なバイナリ ファイルに) 、Windows システムで正しく実行するにはどうすればよいですか?

私は、asm やこれらのプログラムについて詳しく説明しているわけではないので、ここにたどり着く前にできる限り多くのことを調べようとしました。ですから、説明を素晴らしく明確に保つことができれば幸いです。お願いすることがたくさんありましたら申し訳ありませんが、グリルはご遠慮ください。:)

ありがとう!

4

2 に答える 2

2

-f bin複数のフラットバイナリファイル(Nasmの出力)を「リンク」する方法はないと思います。(G)asを使用せざるを得なかった場合、-f bin出力はありません。ldELFリンク可能オブジェクトからフラットバイナリを作成します。コマンドラインはのようなものだと思いますld -oformat binary -T.text=0x7C00 -o boot.bin boot.o。MinGWldがそれを行うかどうかはわかりませんし、複数のファイルを処理するかどうかもわかりません。少なくとも試してみることがあります...

いずれにせよ、リンクはブートセクターに何の役にも立ちません。コンピューター(またはVM?)が起動すると、最初のセクターのみがロードされます(正確には512バイト)。「kernel.bin」(または「stage2.bin」をディスク(または.vfd?)からメモリ内の既知の場所にロードするためのコードを提供する必要があります。この追加のコードを簡単に見つけるには、次のようにすると便利です。ブートセクターの直後に配置します。catまたはcopy(オプションが必要だと思います/b)を使用して、「boot.bin」と「kernel.bin」を1つのファイルに結合し、次にddフロッピー(または.vfd? )。

「kernel.bin」はより柔軟です。512バイトより大きくなる可能性があり、複数のオブジェクトファイルから構築される可能性があります。フラットバイナリが必要になるか、16ビットモードのままなので、実行可能形式のローダーを提供できます。おそらくMZです。32(または64)ビットのPmodeに切り替えたら、PEやELF、またはその他の実行可能形式をロードするように調整することをお勧めします...

この種のことについて私が知っている最良の情報源はhttp://www.osdev.orgです-まだチェックしていない場合はチェックしてください。ハッピーブーティン!

于 2012-12-01T22:30:35.000 に答える