memo
$ nasm hoge.nas -o hoge.img // -l hoge.lst を追加すると対応する機械語が表示できる
$ qemu-system-i386 hoge.img // 上手く行かないときは, -fda というオプションを付ける
-
したこと
- バイナリ直書き.面倒.
- アセンブラで書き直す. 次の変更を加える. (NASMとnaskの違いによるエラー???)
warning が出てくるのは REST を TIMES に変更すれば解消できる. 例)
; RESB 0x1fe-$ ; 0x001feまでを0x00で埋める命令 RESB 0x1fe-($-$$) ; 0x001feまでを0x00で埋める命令
RESB 18
->TIMES 18 DB 0
-
アセンブラ命令. NASM - The Netwide Assembler, docs, index
- DB ... data byte. ファイルの内容を1バイトだけ直接書く命令.
- RESB ... reserve byte.
- DW ... data word. DB命令の仲間. word は16ビット=2バイトの事.
- DD ... data double-word. 同上.
- $ ... 現在の行が先頭から何バイト目がを教えてくれる変数.(厳密には違うらしい.)
- $$ ... 現在のセクションの最初を表す.
-
したこと
- CD-ROMの projects/02_days を作業ディレクトリにコピー.(アーカイブマネージャーを使えばCD-ROMの中身を見ることができる.)
- helloos3/helloos.nas のl.58を
RESB 0x7dfe-0x7c00-($-$$)
に変更すると動く.参考 - helloos4/ipl.nas も同様.
-
アセンブラ命令.
-
$$ ... 現在のセクションの最初を表す.
-
ORG ... origin. 機械語が実行時にPCのメモリのどこに読み込まれるかを教える命令.
The function of the ORG directive is to specify the origin address which NASM will assume the program begins at when it is loaded into memory.
-
JUMP ... そのままの意味. C言語でいうgoto文.
-
MOV ... move. 代入.
-
<label name>: ... entry: , putloop: など. ラベルの宣言.
-
ADD ... 足し算.
-
CMP ... 比較命令.
-
JE ... 条件ジャンプ. 比較命令の結果によってジャンプをしたりしなかったりする.
CMP AL,0 JE fin MOV AH, 0x03
は, C言語でいうと
if (AL == 0) { goto fin; } AH = 0x03;
-
INT ... interrupt. ソフトウェア割り込み命令.
-
HLT ... halt. CPUを停止, 待機状態にする.
に等しい.
-
-
レジスタ 16bit.
- AX ... accumulator, AX = AH(high) + AL(low).
- CX ... counter
- DX ... data
- BX ... base
- SP ... stack pointer, スタック用ポインタ
- BP ... base pointer, ベース用ポインタ
- SI ... source index, 読み込みインデックス
- DI ... destination index, 書き込みインデックス 8bit.
- AL
- CL
- DL
- BL
- AH
- CH
- DH
- BH セグメントレジスタ,16bit. day3で説明.
- ES
- CS
- SS
- DS
- FS
- GS
著者作成のツールを使わない人向け.(面倒な所が多い)
-
書籍のリンク(... community.osdev.info ...)は古いのでこちらを参考にする.
-
fdaオプションをつける.
$ qemu-system-i386 -fda hoge.img
-
参考文献・リンク
-
したこと
- IPL(初期プログラムローダ)の作成.
- 5 OS本体を書き始める: haribote.sys と ipl.bin をくっつける.(Makefile参照.)
mformat -f 1440 -C -B ipl.bin -i haribote.img :: mcopy haribote.sys -i haribote.img ::
-
9 ついにC言語導入へ: 参考文献・リンクを参考にする.(これもMakefile参照.)
-
アセンブラ命令.
- JC ... jump if carry. キャリーフラグが1だったらジャンプしなさい,という命令.
INT 0x10
を読んでエラーがない場合はキャリーフラグが0,エラーがある場合はキャリーフラグが1になる. - JNC ... jump if not carry.
- JBE ... jump if below or equal
- JB ... jump if below
- EQU ... C言語でいう#define. 定数を宣言するのに使う.
- JC ... jump if carry. キャリーフラグが1だったらジャンプしなさい,という命令.
(メモを取るのを忘れてた.)
-
INSERT命令は追加せずにnasmのオプションで指定した.
-
アセンブラ命令.
- したこと
- 5 フォントを増やしたい までは本に沿って進めていくだけ.
- 5 でフォントを増やすために配布されていた makefont.c を改造して
というコードを hankaku.c というファイルに掃き出しそれを bootpack.c から読み込むようにした.
char hankaku[4096] = { 0x00,0x00, ..., 0x00 ... ... 0x00, 0x18, ..., 0xe7, 0x00, 0x00 // A ... ... ... };
- sprintf 動かず. 取り敢えず,sprintf を bootpack.c に直接書いた.
- あとは本に従っていく.
- したこと
- bootpack.c の分割.
- Makefile を修正した. 特に
-fno-pic
オプションを付け忘れると動かないことに注意する.(このあたりはよくわかってない.参考, OS自作入門 6日目-1 【Linux】 | 分割コンパイル)
- Makefile を修正した. 特に
- あとは本に書いてる通りにすすめていけるはず。
- bootpack.c の分割.
- したこと
- 本のとおりに進めていくだけ.
- したこと
- 本のとおりに進めていくだけ.