3

Mac OS X環境で簡単なOSを書いています。nasm で簡単なブートローダーをビルドできます。more の部分を C 言語で開発するときは、一緒にビルドする必要があります。Mac OS X の GCC は、Mach-O 出力形式をコンパイルします。出力オブジェクトの命令部分を cat し、それを nasm 部分とリンクする方法を知りたいです。

ありがとう。

4

1 に答える 1

2

あなたが見ていないより大きな問題があります。

GCCは16ビットx86コードを生成せず、32ビットまたは64ビットのみを生成します。x86 PCブートローダーは、16ビットコード専用の16ビットモードである実際のアドレッシングモードで実行を開始します。

したがって、gccでコンパイルされたCコードとNASMでコンパイルされたアセンブリコードをリンクできたとしても、Cコード部分(さらに言えば32ビットコード部分)は、実行するまで実行できません。 32ビット保護モードに切り替えましたが、これは非常に簡単なことではありません。

また、512バイト長のブートセクタでもプロテクトモードに切り替えたくありません。BIOS機能はプロテクトモードでは使用できません。切り替えるのが早すぎると、ディスクからそれ以上のものをロードできなくなります。

最も実用的な戦略は、ブートローダーをいくつかの部分に分割することです。512バイト長のブートセクタは、BIOSディスクI/O機能を使用して次のパーツをロードします。また、これらの他の部分には、OS全体、または同じBIOS I / O機能を使用するか、実際のモードまたは保護モードで独自のディスクドライバーを使用することにより、OSの残りの部分をロードするのに十分なコードが含まれます。

したがって、ブートセクタ用にアセンブリ言語で16ビットコードを手動で作成する運命にあります。Cも32ビットもありません。

ただし、ブートローダーの他の部分に16ビットx86コードを生成できる他のCコンパイラを使用することはできます。オンラインで無料で入手できるこのようなコンパイラは少なくとも2つあります。

  • Turbo C ++ 1.01(DOS、Windows XP以下、DOS / Windowsを搭載したVM、たとえばDosBoxでのみ動作します)
  • Watcom C / C ++ 1.9を開きます(DOS、Windows、およびおそらくLinuxで実行されます)
于 2012-10-20T03:28:53.447 に答える