0

私はブートローダーを書いていますが、私がしていることが正しいかどうかわかりません。まず、このバッチスクリプトを使用してブートローダーをコンパイルしています。

dm\bin\dmc.exe -msdo -c -cpp bootloader.cpp
masm\bin\ml.exe -c bootloaderASM.asm
dm\bin\link.exe /BINARY bootloaderASM.obj bootloader.obj

私はDMCのコンパイラとリンカをmasm615アセンブラと一緒に使用していますが、それらはすべて16ビットである必要があります(DMCは16と32の両方です)。アセンブリファイルbootloaderASM.asmで、「org 07C00」を追加すると、出力ファイルbootloaderASM.sysは07C00まで0で埋められ、その後、期待されるコードが埋められます。ただし、削除すると、出力ファイルは次のようになります。期待される。私が理解したように、org命令は、ベースが07C00になるように、命令で使用されるアドレスを調整するだけです。出力ファイルをゼロで埋めてはいけないと思いますか?

コンパイラとアセンブラからの.objファイルは問題ないようです。0x07c00まで先行ゼロは含まれていませんが、リンカーからの最終出力は何が問題なのかです。

さて、リンカーの問題はありますか?どうすれば修正できますか/別の(16ビット)リンカーを提案しますか?また、ブートローダーのorg命令を単に無視しても大丈夫ですか?

また、ブートローダーを読み取り、仮想ハードドライブのブートセクターに書き込むプログラムを作成しました。リンカー出力の先行ゼロを無視するように変更するだけで機能しますか?

ありがとうございました。

4

1 に答える 1

0

私が理解したように、org命令は、ベースが07C00になるように、命令で使用されるアドレスを調整するだけです。出力ファイルをゼロで埋めてはいけないと思いますか?

NASMマニュアルによると、のMASM実装は、ORG実際に後続の出力を指定されたオフセットに移動します。

観察すると、その時点より前に他のモジュールからのコードが存在する可能性があるため、.OBJファイルはオフセットを格納するだけであり、単純なパディングの場合、リンカーがオフセットを適切に配置することを期待します。

さて、リンカーの問題はありますか?どうすれば修正できますか/別の(16ビット)リンカーを提案しますか?

ここではリンカーに問題はありません。それはMASNが行動する癖です。

また、ブートローダーのorg命令を単に無視しても大丈夫ですか?

また、ブートローダーを読み取り、仮想ハードドライブのブートセクターに書き込むプログラムを作成しました。リンカー出力の先行ゼロを無視するように変更するだけで機能しますか?

OSDev Wikiを読むと、セグメントレジスタが適切に処理されていれば、どちらもうまくいく可能性があります。私の理解では、出力は0ハードディスクパーティションの所定の位置に配置し、offsetにロードする必要があります0x7c00。この仕様に従って動作する限り、「動作するはずです」。

以下は、さらに役立つ読み物を提供する可能性があります。

関連する投稿(stackoverflow.com/questions/12552072/masm-segment-directive)のMASM SEGMENT(msdn.microsoft.com/en-us/library/d06y3478%28v=vs.80%29.aspx)ディレクティブ

PS。(私は「少なくとも10の評判が必要」ですが、これが私の最初の投稿であるとは考えていません。「2つ以上のリンクを投稿する」。)

于 2013-03-04T13:12:45.790 に答える