30日でできるOS自作入門【4日目】
概要
これはMozyの1人アドベントカレンダー 2018 の4日目の記事です。
書こうとした経緯は、こちら
今日の内容
- プログラム部分をどんどん書き換える
今日やったこと
ORG 0x7c00 ; このプログラムがどこに読み込まれるのか ~中略~ ; プログラム本体 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 fin MOV AH,0x0e ; 一文字表示する MOV BX,15 ; カラーコードを指定 INT 0x10 ; ビデオBIOS呼び出し JMP putloop fin: HLT ; 何かあるまでCPUを停止させる JMP fin ; 無限ループ msg: DB 0x0a, 0x0a ; 改行を2つ DB "hello, world" DB 0x0a ; 改行 DB 0 RESB 0x7dfe-$ ; 0x7dfeまでを0x00で埋める命令 DB 0x55, 0xaa ; 以下はブートセクタ以外の部分の記述 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432
ハマりポイント
- ORG命令って昨日までのコードのどこに出て来ていたんだろう
- このくらいになってくると書いたアセンブラとバイナリの対応がわからなくなってくる
- 諸々の疑問の解決に最後にあげたブログの内容がすごく参考になった
知ったこと
- ORG命令
- origin の略
- なぜ 0x7c00 なのかはこの節を読み込んでいくとわかるらしい
- 機械語が実行時にどこに読み込まれるかを指定する
- この命令をかくと、$ の意味が昨日までとは変わって、出力ファイルの何バイト目であるかではなく、読み込まれる予定のメモリ番地に変わる
- JMP命令
- jump の略
- これはC言語でいうgoto文
- entry; はラベルでjumpとセットで飛び先の指定に使ったりする
MOV命令
- move の略
- 基本的にただの代入である
- MOV AX,0 とは AX = 0; ということ
- SS, AX とは何かっていうのもまた読んでいくとわかるらしい
レジスタの説明
- AX アキュムレータ
- CX カウンタ
- DX データ
- BX ベース
- SP スタックポインタ
- BP ベースポインタ
- SI スタックインデックス
- DI デスティネーションインデックス
- これらは全て16ビットのレジスタ
- その証としてX が付いていてこれは extend (拡張)という意味
- 昔はCPUが8bitだった時代の名残で進化したんだぜという意味で付いている。