imHo RSSフィード

2011-02-15

自作OS入門をnasmで

自作OS入門を読み返してみてるけど、これ相当すごい本じゃないか?タイマ割り込みやタスクスイッチあたりが熱い。

でいろいろツールを揃えてくれているのはいいんだけど、それらのツールのことはよくわからないので、ブラックボックスをできるだけ少なくしたい。ということで、アセンブラをnask.exeじゃなくてnasmにしてやってみる。x86アセンブラ全然知らんけど。

nasmは403 Forbiddenからダウンロード。2日目のhelloos04での510バイト目までを0で埋めるための「resb 0x7dfe-$」が、nasmではエラーになる。nasmでは$と$$を使って、「resb 0x01fe-($-$$)」と書くようです(WeBlog of Sky color OS自作入門-Hello World...)。あとジャンプ命令JMPにshortとつけないと EB xx じゃなくて E9 xx xx という、オフセットが2バイトの命令になってしまう。勝手に選んでくれればいいのに。

; hello-os
; TAB=4

	ORG	0x7c00		; このプログラムがどこに読み込まれるのか

; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述

	JMP SHORT	entry
	DB	0x90
	DB	"HELLOIPL"	; ブートセクタの名前を自由に書いてよい(8バイト)
	DW	512		; 1セクタの大きさ(512にしなければいけない)
	DB	1		; クラスタの大きさ(1セクタにしなければいけない)
	DW	1		; FATがどこから始まるか(普通は1セクタ目からにする)
	DB	2		; FATの個数(2にしなければいけない)
	DW	224		; ルートディレクトリ領域の大きさ(普通は224エントリにする)
	DW	2880		; このドライブの大きさ(2880セクタにしなければいけない)
	DB	0xf0		; メディアのタイプ(0xf0にしなければいけない)
	DW	9		; FAT領域の長さ(9セクタにしなければいけない)
	DW	18		; 1トラックにいくつのセクタがあるか(18にしなければいけない)
	DW	2		; ヘッドの数(2にしなければいけない)
	DD	0		; パーティションを使ってないのでここは必ず0
	DD	2880		; このドライブ大きさをもう一度書く
	DB	0,0,0x29	; よくわからないけどこの値にしておくといいらしい
	DD	0xffffffff	; たぶんボリュームシリアル番号
	DB	"HELLO-OS   "	; ディスクの名前(11バイト)
	DB	"FAT12   "	; フォーマットの名前(8バイト)
	RESB	18		; とりあえず18バイトあけておく

; プログラム本体

entry:
	MOV	AX,0		; レジスタ初期化
	MOV	SS,AX
	MOV	SP,0x7c00
	MOV	DS,AX
	MOV	ES,AX

	MOV	SI,msg
putloop:
	MOV	AL,[SI]
	ADD	SI,1		; SIに1を足す
	CMP	AL,0
	JE SHORT	fin
	MOV	AH,0x0e		; 一文字表示ファンクション
	MOV	BX,15		; カラーコード
	INT	0x10		; ビデオBIOS呼び出し
	JMP	putloop
fin:
	HLT			; 何かあるまでCPUを停止させる
	JMP SHORT	fin	; 無限ループ

msg:
	DB	0x0a, 0x0a	; 改行を2つ
	DB	"hello, world"
	DB	0x0a		; 改行
	DB	0

	RESB	0x01fe-($-$$)	; 510バイト目までを0x00で埋める命令

	DB	0x55, 0xaa	; 最後にマーカーが必要
  • あとは、QEMUの実行に必要なbios.binとvgabios.binがなんなのかわからない…。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/mokehehe/20110215/nasm