K氏のheboOSをまねてみる

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・・・」
とか思って心配したのですが、
なにやら毎度のガッツで元気に乗り切っている。
実に楽しみです。

1-

BluesBB ©Sting_Band