[PR]生年月日で2010年運命占い:初回無料!貴女の悩みを占い師に相談


 本業の学業サボってなにやってんだか私は....(-_-)
でもそんなこと言い出したら面白くないもんね・・・。大体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になってますがそこらへんは使い分けてください また、ソースと出力先のパスですがパスを通してないと、フルパスで指定する必要があるのでパスを通したほうがよいでしょう
(うざったいのでMakeFile書こうと思いますがそれは後ほど....)

コンパイラが吐き出したバイナリを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という値が入ってないとだめだそうです。
 これを入れてないとMBR自体が無効なものとして扱われ、BIOSによってはブートストラップローダーが実行されませんし、パーティーションテーブルも読み込まれません、この番号はマスターブートレコードが正当なものであることを保証する署名(シグニチャ)です。  

 これで結構動いたらかなり感動ものです(少なくとも私はねw)次は文字列表示ですが、あぁここらへんから難しくなるなぁ〜  

文字列表示
 ぉぉ〜文字列表示から一気に難しくなる....
私苦労しました....いろいろ教えてくださった方に感謝をささげながら、文字列表示をしました。 文・字・列・表・示だよ!!

 文字列表示はC言語のchar *str同様ポインターを使い文字列表示を行います。
しかしながらBIOSには文字列表示の割り込み用意されてないと思うので....(たぶんw)だから一文字づつつぎつぎと表示させてゆくという形式をとります
しかしながら問題があります、ポインターを使うということは文字列をメモリーに確保しておくということなのでメモリ面での設定があります。

セグメントレジスタの設定。


[PR]解禁!サクラのいない直メなび:※男女タダで遊べる、大人のためのコミュ