この記事は#一人GWハッカソン 5/2の記事です
本日のテーマはOSなしでHelloWorldをする
です
最初はOSを作ろうと思っていましたが一日では無理でした。
10:00~12:00 環境構築
Windowsで環境を構築しようとしたけど上手くいかない… 仕方なくVirtualBoxの上のLinuxを使用する
OSはXubuntu16.04、アセンブラはnasm、仮想マシンにはqemuとvirtualboxを使用
12:00~13:00 初めてのプログラム
[BITS 16] ORG 0x7C00 BOOT: CLI HLT TIMES 510 - ($ - $$) DB 0 DW 0xAA55
起動した後にブートセクタがメモリの0x7C00に読み込まれるらしいのでORGで0x7C00をセット(GASではORGは使えないみたいですね)
CLIで割り込み禁止、HLTでプログラム終了
最後に位置合わせに0x00を出力しブートセクタ終端の0xAA55
C言語でいう
#include ‹stdio.h› int main(void){ return 0; }
みたいなプログラムらしい。
13:00~14:00 いろいろ
スタックとかセグメントとか
14:00~15:00 INT10
画面入出力とかディスクの読み書きとかするためにはBIOSが提供している機能を使う
画面入出力をするためにはINT 0x10を使う。
INT0x10を使って文字を出力するためには
AHに0x0E
ALに文字のASCIIコード
BHにビデオページ番号
(よくわからないけど0x00で良いらしい)
BLに色を指定
[BITS 16] ORG 0x7C00 BOOT: CLI MOV AH, 0x0E MOV AL, 0x41 ;'A' MOV BH, 0x00 MOV BL, 0x07 ;グレー INT 0x10 HLT TIMES 510 - ($ - $$) DB 0 DW 0xAA55
色が変わらないと思ったらビデオモードというのを変えないといけないらしい
グラフィックモードを指定するためにはAXに0x4f02を入れてBXにビデオモードを入れる
ビデオモードは
VESA BIOS Extensions - Wikipedia
で解説されている
[BITS 16] ORG 0x7C00 BOOT: CLI MOV AX, 0x4f02 MOV BX, 0x0102 ;800x600 16色モード INT 0x10 MOV AH, 0x0E MOV AL, 0x41 ;'A' MOV BH, 0x00 MOV BL, 0x0A ;ライトグリーン INT 0x10 HLT TIMES 510 - ($ - $$) DB 0 DW 0xAA55
AHに0x13を入れてINT 0x10すると文字列が表示できるらしいです
なんかちょっと感動
15:00~16:00 寝
昼寝
16:00~ ゚Ω\ζ°)チーン
ディスクの読み書きにハマる
解決方法が分からず終
反省とか
またいつか挑戦したい
こんな感じであと5日浅く広く色々やれればと思う
INT0x10しただけだしハッカソンじゃなくね!?
参考:
http://softwaretechnique.jp/OS_Development/scratchbuild.html