だから、質問は奇妙に思えるかもしれないが、のは、私はコンパイルすることを言わせて:ブート可能なプログラムを作成するには?
int main(void)
{
int x = 3;
int y = 4;
int z = x + y;
}
は、CPUがちょうどそれを実行するために、それは可能ですか?どうやって?たとえば、これで私はモニターに書き込むことができますか? (正しく覚えていれば、表示するものを書くことができる記憶場所があります)
だから、質問は奇妙に思えるかもしれないが、のは、私はコンパイルすることを言わせて:ブート可能なプログラムを作成するには?
int main(void)
{
int x = 3;
int y = 4;
int z = x + y;
}
は、CPUがちょうどそれを実行するために、それは可能ですか?どうやって?たとえば、これで私はモニターに書き込むことができますか? (正しく覚えていれば、表示するものを書くことができる記憶場所があります)
プログラムの場合、オペレーティングシステムのサービスを開始する以外には依存しません。追加的に入力または出力を行う場合は、ほとんどの場合、入出力を実行するためにオペレーティングシステムに依存します。
オペレーティングシステムを独自のコードに置き換える場合は、うまくいく可能性があります。最小限のオペレーティングシステムとプログラムローダーが存在します。しかし、はい、あなたは学ぶべきことがたくさんあります。
さて、私はそれを知っているので、 '#include'や' printf'などのものは除外しました。これらのものは明らかにOSとの関係があり、尊重されたライブラリや依存関係がなければ実行できません。私はできるだけシンプルにしようとしました。 – corazza
@Bane:簡単なブートローダプログラムを理解して変更することから始めてもよいでしょう。ファイルシステムの解釈やカーネルのロードなど、オペレーティングシステムのすべてのものを削除してください。それを代わりに実行したい操作に置き換えてください。多くのブートローダはBIOSコールを使用して画面の入出力を行うことに注意してください。他はテキストスクリーンドライバを実装します。 – wallyk
はい、実行する方法はありますが、問題はありません。 http://github.com/dwelch67私にはたくさんの例があります。 pcemuやpcemu_samplesを使用してx86ベースのものを作ることができます。x86については、後で説明します。プロセッサーを気にしなければ、多数のシミュレーターと組み込みプロセッサー/マイクロコントローラーの例があります何が起こっているのかが分かりやすくなります。
printfは、これほど多くの方向、浮動小数点数、文字列要素、除算値などに到達するための最悪のCライブラリ呼び出しです。このようなことは避けてください。私はあなたがコメントを読んでいないことを知っています。
パラレルポートのLEDまたはピンを点滅させたり、シリアルポートから文字を送信したりするプログラムを見るには、グラフィックスカードのレジスタをプログラミングして何も表示せずにそのコードをデバッグするよりもはるかに簡単ですあなたが進歩しているならば。
x86では、実際にはOSではなく、この種のコードを持つ層があり、テキストモードでスクリーンに文字を印刷してプログラムを実行するように簡単に呼び出すことができます。私はpcemu_samplesから取り除きましたが、完全なpcemuやdosboxなどのx86エミュレーション環境と実際のコンピュータでは、これらの機能を利用できます。 sim環境(dosbox、pcemu、etC)のいずれかがより良い場所です(x86で始める必要があると感じる場合は、ここでテーマを気にしてください。もしあなたがx86の場合は、dosboxやそのようなものから、おそらく起動可能なUSBスティックにあなたのやり方で作業し、そこからあなたの道を進めることができます。
埋め込みプロセッサーには50ドル未満の評価ボードが多数あり、20ドル未満の評価ボードもあります。しかし、あなたが学ぶことができる無料の多くの多くのシミュレータ。私はあなたが試してみることができるものがいくつかありますが、amber_samples、pcemu_samplesはおそらく最も安定です(私のものをデバッグする必要はほとんどなく、あなたのものをデバッグすることはほとんどありません)、次に安定性の低いもの、meecoate、msp430simなど$ 5が得られますあなたはmsp430ボード、$ 10はあなたにARM皮質m3ボードを手に入れるでしょう、$ 20はあなたにマイクロコントローラ、マイクロコントローラボード(cortex-m4ベース)と呼ばれるほど強力です。そしてより多くのお金は、より速くまたはより良いが、より多くの選択肢を得ることはありません。 Linuxを走らせることができるボードは、あなたが習得しようとしているものに対してより多くの苦痛を与え、そのレベルの下にとどまることができます。
単純な例では、コンパイラがその関数用に作成するコードの外に、リセットベクトルからmain関数のエントリポイントに分岐する命令が1つだけ必要です。理想的には、スタックを設定し、最終的に.bssをゼロにするか、.dataなどをコピーしたいとします。組み込みバイナリを構築するためにツール(コンパイラ、アセンブラ、リンカ)を使用することを学ぶだけで、ハードウェア/シミュレータを実行しなくても、リセットとmain()の間でどのようにドットを接続するかを解説しますそれをmainと呼ぶ必要はありません。あなたが望むものに名前を付けることができます。いくつかのコンパイラでは、mainと呼ぶべきコンパイラはバイナリに余分なジャンクを投げます)。
それはちょうど長い話ですが、種類 は、一般的に、x86のシリーズのアセンブリは非常に有名であり、あなたがそれを学ぶ通過することができますアセンブリ に精通している必要があり、あなたのCPUのために適切であるものをスクラッチ知っている必要があります。
あなたがそのようないくつかのことを見てされます。
Start:
mov AX ,0xff ;example 1
mov BX ,[CX] ;example 2
myString db 'Hi This is my First scratch',0 ;Print Example
call printFunc ;example 3
jmp $
printFunc:
mov ah, 0Eh ;This how you print on screen in Assembly
loop
lodsb
cmp AX,BX
je loop
など など ..... ... 。
ehh ...プログラマブルなマイクロ/ PICで動作している場合を除き、実際はそうではありません。 – Anycorn
http://wiki.osdev.org/Main_Page - これは全書籍のトピックです。 – Mat
@Anycorn、どうですか?これを行う方法がなければなりません、そうでなければ何のポイントもありません!とにかく、私は読むことがたくさんあるようです... – corazza