|
1:K氏のheboOSをまねてみる hideyosi 09/22 17:32 OSASKのK(川合氏)が、OS作成に関するチュートリアルを公開している。ふむふむ。なになに? あいかわらずKは口がうまい! なんだか出来そうな気がしてくるじゃねーかよ! そんなわけで、思いつくまま体験をばしてみたり。 参考: http://community.osdev.info/index.php?FirstStep 2:Re: K氏のheboOSをまねてみる hideyosi 09/22 17:45 さーって。まずはDOSのプログラムでいいんだよね。 ・・・があぁぁあ!! 私って、そいえばDOSのプログラムもしたことないんだよね。(^^;) とりあえず、昔つかったMinGWがセットアップされたまんまだ。これ使えるのかな??? 3:Re: K氏のheboOSをまねてみる hideyosi 09/22 18:17 MinGWでできるようだね。MinGWをインスコして、コマンドプロンプトでパスを通すだけ。 お決まりのHello Worldだよん。(いちおう区別できるように、名前とか書いてみたり。) #include<stdio.h> int main(){ printf("Hello World by hideyosi\n"); } おー! めでたくa.exeが出来上がったニョ! (なんか幼稚なことしてますねぇ・・・(^^;) ) 4:Re: K氏のheboOSをまねてみる hideyosi 09/22 18:31 さーて。こっからが大変。 MinGWを使って、DOSのシステムコールを使わないようにプログラムするにはどうしたらいいのかな? (なんか確かにアセンブラ使ったほうがいいのかもしんないけどね。ちょっとがんばって調べてみよう。) 5:Re: K氏のheboOSをまねてみる hideyosi 09/22 19:51 ・・・うーむ・・・ どうもあっちこっちで調べてみたんだけど、C言語の中にアセンブラを自然に埋め込む「インラインアセンブラ」っつー機能を使うみたいだなぁ。 ・・・あれ?そうすると、やっぱアセンブラがまったくわかんないとアカンつーことかな??? (^^;) どうせ最初はHelloWorldをOSみたく起動させようってだけなんだし、しゃーない。ちょこっとアセンブラの解説を読んでみよう。 6:Re: K氏のheboOSをまねてみる hideyosi 09/22 20:15 のわぁぁん!!! MinGW(GCC)って、インラインアセンブラが高機能なぶん、エラクややっこしいじゃんか! でもなぁ。アセンブラってややこしいから最低限に収めて、あとは御気楽なCとかでっていうのには、素のアセンブラは・・・ えーい!メンドイ!! とりあえずテケトーに文字だけ出すアセンブラのコード書いちゃえ! 7:Re: K氏のheboOSをまねてみる hideyosi 09/22 21:06 ・・・つかさ。NASKがあるじゃんか!! ぐはぁ! Kタンのサンプルまであるじゃんかよ!!! そんなわけで、まずはNASKでさっきのCと同じようなのを作ろう。 [BITS 16] [OPTIMIZE 1] [OPTION 1] [INSTRSET "8086"] [FORMAT "BIN"] ORG 0x100 MOV DX,msg MOV AH,0x09 INT 0x21 MOV AX,0x4c00 INT 0x21 msg DB "hello, world by hideyosi", 0x0d, 0x0a, "$" えーっと。こんなんでnaskでコンパイルしてと。 あっれ? ぜんぜん出力しないぞ!? と頭を抱えていたんだけど、ふと思い立って、純粋DOS(95)で実行。うにょ! 動いた! バンザーイバンザーイ!!!!!!! ・・・ だめじゃん!!!! orz だーかーらぁ!!! INT21とか使っちゃいけないんだってば!! うーん。やっぱ486本読まんとイケンかな?? (T∀T) 8:Re: K氏のheboOSをまねてみる hideyosi 09/22 22:45 うーん。ちょこっと解ってきたぞ。えーっと。AT互換機の場合、BIOSに様々な実行命令があらかじめ格納されている。そこに命令するとその動作をしてくれるってわけだ。すんごく大雑把ではあるけど、DOSのファンクションコールやVBの関数と理屈が同じわけだ。 で、どうもある程度、パターンがあるみたいだ。DOSのファンクションコールは ahレジスタに呼び出したい機能の番号(ファンクション番号)を入れて INT 21 とやると、その機能が働く。 BIOSの場合は、どうもahレジスタに機能番号を設定して INT 10 とやるみたいだ。(もちろん例外とかオプションもあるけどね) BIOSの機能番号で「文字表示」は、0eらしい。で、この機能は他のレジスタを使ってオプションを設定するわけか。 AL:表示する文字の16進コード えーっと。するってーと、たとえば画面にAって表示するだけの場合だと、 mov al,0x41 ;「A」のアスキーコードは41hだよな。たしか mov ax,0x0e INT 0x10 っと、こういうことになるのかな?? (実験してみよう) 9:Re: K氏のheboOSをまねてみる hideyosi 09/22 23:31 そんなわけで、こんなソースを作って実験。 [BITS 16] [OPTIMIZE 1] [OPTION 1] [INSTRSET "8086"] [FORMAT "BIN"] ORG 0x100 MOV AL,0x41 MOV AH,0x0e INT 0x10 JMP $ マシンをリセットして・・・・ キタ━━━━━━(゜∀゜)━━━━━━!!!!!!!! へぇぇ! おもしれー! なるほどなるほどぉ!!! もっといろいろなBIOSコールがあるみたい。やってみよ! 10:Re: K氏のheboOSをまねてみる -- K 09/22 23:32 MinGWで書いていた頃は、 「それじゃそもそもIA-16じゃなくてIA-32・・・」 とか思って心配したのですが、 なにやら毎度のガッツで元気に乗り切っている。 実に楽しみです。 |