本業の学業サボってなにやってんだか私は....(-_-)
でもそんなこと言い出したら面白くないもんね・・・。大体LunaticPoliceはどうなってんだ(゚Д゚#)
まぁまぁ同じことに集中的に根気をつめるのは少々つかれました、ちょっとリフレッシュっ
てかお勉強!!...
開発環境その他詳細については今後少しずつUPしてゆく予定です。とりあえず今はアセンブリ言語で
BIOSの割り込みを使って、そのプログラムをコンパイルして.binファイルをつくり、それをddコマンド等でFD にコピーし、PC起動時
ディスクドライブに入れてHello World!!が表示されるといった感じですね、残念ながらCなどの高等な言語ではこれはできませんのでアセンブラでそれを実現したいと思います
コンパイラにはNASMという有名なフリーのアセンブラを使いますこれを使って.binファイルを作ります
binファイルって言うのはOS依存である(たとえばここではWindowsのEXE)EXEのヘッダを取り除いたような
ものらしいです
アセンブラもほかにもいろいろ選択肢があるのですがTASMはただじゃないし(つーかもう売ってないんじゃないか?w)GASはニーモニックがx86環境において一般的ではないそうなのでやっぱここは有名なNASMでしょう
フリーだし。
NASMはWin版もあるしLinux版もあるので開発環境がより広くなるでしょう
(MASMという手もあるのですが、どうだろうねぇ〜( ´_ゝ`))
早速着手
http://www.geocities.com/sunriseos/
ここにですね、SunriesOSっていうOSがあります、BootLoaderとKernelからなる非常にシンプルなOSでしてこのソースはかなり勉強になると思いますよ、でも全部アセンブリ言語です。
このソースを参考にしてですね、HelloWorldなるものを書くのですが、その前にまずHのみを表示するプログラムを作成します...
org 0
start:
mov al,'H'
mov ah,0Eh
mov bx,7
int 10h
times 510-($-$$) db 0
dw 0AA55h
OKII、これをboot.asmとでもして保存します。
んでコンパイルしてBinファイルにするわけですね、まずコンパイルですが。NASMW "d:\NASM\boot.asm" -o "d:\NASM\boot.bin" -f binとしでコンパイルします、私はWin上で開発してるのでNASMWになってますがそこらへんは使い分けてください また、ソースと出力先のパスですがパスを通してないと、フルパスで指定する必要があるのでパスを通したほうがよいでしょう
コンパイラが吐き出したバイナリをFDに書き込みます
Windows/DOSでは
dd boot.bin A:
Linuxでは
dd if=boot.bin of=/dev/fd0
とでもしてそれぞれFDに書き込みます。
ソースの詳細ですが
org 0 ;ORG擬似命令、オフセットアドレス0000hからコードを配置します
;無くてもいいのかなこれw
start:
mov al,'H' ;ALレジスタに'H'格納
mov ah,0Eh ;AHレジスタに 0Eh格納(BIOS割り込み指令コード)
mov bx,7 ;BXレジスタに 格納
int 10h ;BIOS割り込み (10h)
times 510-($-$$) db 0 ;プログラムのサイズを510バイトにする?不足分は0で補う!?
dw 0AA55h ;マジックナンバー(これに2byte使う)
最後のtimes 510-($-$$) db 0についてですが、これについてはBIOSの特性から来ているようです
BIOSは起動時にまずすべての機器のチェックを終えたあとFDの先頭512Byteを読み込みます。
よって最初のbootプログラムは512byteでなければなりません...dw 0AA55h
この行についてですが、これはマジックナンバーとよばれるものだそうです、なにやらBIOSによって読み込まれるプログラム、512byte分の最後の2byte部分には必ずマジックナンバーと呼ばれる0xAA55という値が入ってないとだめだそうです。これで結構動いたらかなり感動ものです(少なくとも私はねw)次は文字列表示ですが、あぁここらへんから難しくなるなぁ〜
文字列表示はC言語のchar *str同様ポインターを使い文字列表示を行います。
しかしながらBIOSには文字列表示の割り込み用意されてないと思うので....(たぶんw)だから一文字づつつぎつぎと表示させてゆくという形式をとります
しかしながら問題があります、ポインターを使うということは文字列をメモリーに確保しておくということなのでメモリ面での設定があります。
セグメントレジスタの設定。