2012-03-13 3 views
2

これまでのところ、私はそれからブートし、画面にhello worldを書くことができるアセンブリスクリプトを持っています。今私はいくつかのCコードを記述し、私のアセンブリスクリプトを何とか実行できるようにしたい。私のコンパイラにmingw gccを使っています。これはアセンブリの私のブートローダです:ブートローダープログラムからCコードを実行

org 7C00h 
jmp short Start 
Msg: db "Hello, world" EndMsg: Start: mov bx, 000Fh 
mov cx, 1  
xor dx, dx 
mov ds, dx 
cld    Print: mov si, Msg 

      Char: mov ah, 2  
int 10h 
lodsb 


mov ah, 9 
int 10h 
inc dl  
cmp dl, 80  
jne Skip 
xor dl, dl 
inc dh 
cmp dh, 25  
jne Skip 
xor dh, dh 
Skip: cmp si, EndMsg 
jne Char   
jmp Print  times 0200h - 2 - ($ - $$) db 0  
dw 0AA55h 

私の質問は、アセンブリスクリプトが実行するようにどのようにcコードをコンパイルするのですか?私の現在のブートローダをどのように編集すれば可能でしょうか?

+1

...すべての詳細については、多くの多くの時間をグーグル必要がありますが、質問をしていません。あなたが尋ねていない質問には答えられません。 – abelenky

+0

オペレーティングシステムの開発に関するチュートリアルを参照することをお勧めします。たとえば、[Bona Fide OS開発チュートリアル](http://www.osdever.net/tutorials/index)、[OSDev.org](http://wiki.osdev.org/Expanded_Main_Page)のチュートリアル –

+1

可能な複製[Assembler経由でブートローダレベルでCプログラムを実行する](0120-18753-1)を参照してください。 –

答えて

3

まず、使用するコンパイラを選択し、その詳細を調べる必要があります。 Cプログラムは、標準的な初期化、main()をエントリーポイントと標準ライブラリ、そしてそのような保証が提供されていない "独立した"環境を想定した "ホスト"環境用にコンパイルできます。 Cコードを呼び出すには、ブートローダに適切な環境設定(スタック、データセグメントなど)を行う必要があります。これの詳細はコンパイラ固有です。ブートローダに適した形式にオブジェクトコードを変換することも問題になります。 16ビットコードでは、少なくともTurbo CとWatcom Cが無料で利用できます。 Watcomはより進歩的で近代的でオープンソースです。 標準ライブラリはこのような設定では利用できないので、Cコードは環境に合わせて特別に書かなければなりません。これには、例えば水中石などの水中の石が含まれる。ライブラリ呼び出しを記述しないにもかかわらず、通常32ビット長の乗算がライブラリに実装されていました。

[一般に、私は正確にCを使用するようにあなたの要求と混同しています。ブートローダが実行速度を必要としなくなるとすぐに、そのようなコンテキストに適用可能なものをForthとして使用する方が適切です。 (FreeBSDのブートローダを参照)の実装を使用する準備がある]

1

16ビットのCコードをコンパイルする必要があります。その後、ブートデバイスの所定の位置にコピーします。ブートローダーを修正して、コードをメモリにロードしてそれにジャンプする必要があります。また、gccは現在16ビットにコンパイルできません。私はWatcomのコンパイラができると聞いたので、それを使うべきです。

0

一般的に次のことを行う必要があります。

  1. あなたはより良い、これは トラブルの多くを回避する、クロスコンパイラを用意したいです。
  2. あなたのブートローダは、ディレクトリ/ファイルをフロッピー またはCDで見つけることができるはずです。たとえば、ブートローダがCDにインストールされている場合、 はCDコンテンツを解析する方法を見つける必要があります。 CDメディア用の「Torier」規格「El 」を参照することができます。
  3. ブートローダは、cプログラムの環境を準備する必要があります。 たとえば、Cプログラムでは32ビットのプロテクトモードが必要な場合は、 ブートローダーがそれを準備する必要があります。
  4. あなたのブートローダは、Cプログラムをメモリにロードし、 にジャンプする必要があります。
  5. ほとんどの場合、別のブートローダを作成する必要があります。あなたの#1 ブートローダは#2ブートローダをロードし、#2ブートローダはCプログラムを ロードします。 2番目のブートローダーはアセンブリで書くことができます。その場合、 は作業を確認するのがはるかに簡単です。
  6. Cプログラムは自立モードに準拠する必要があります。

あなたは興味深い

+0

16- MSVC 1.52cのような16ビットの実行可能ファイル/バイナリをターゲットとすることができるコンパイラを特に使用する場合、_C_コードのビット。 OpenWatcom;ほとんどのLinuxディストリビューションで利用可能なBruceのCコンパイラ(bcc)のようなものです。 –

関連する問題