30日OS自作入門2日目(Win10)
初めに
今回は、Windows10の方で開発していくわけですが(Linuxでやって挫折したなんて言えない…)
後は、自作OSのブログを調べてみると、なんかやけにMacの記事が多いのでWin でやったのがあってもいいんじゃないかと思いまして…(やればできる?から書かれてないだけかもしれない)
もくじ
2日目
使用ツール
・著者のツール
・VScode2019(著者のソースがShiftJISで書かれているので文字化けに注意)
・WinMerge:
WinMerge - You will see the difference…
これがあれば死ぬような思いをして写経ミスを訂正することがなくなる
大事なことなので赤くしました…(白目)
Linuxでやったときには0日から1日まではLinuxでやったのと、同じ感じになりそうだったので今は割愛
アセンブリ学習とMakefileの入門
命令に関してのまとめ
ORG命令
機械語がメモリ上の何番地から読み込まれるかに関して教えてあげる命令
例
ORG 0x7c
JMP命令
指定されたラベルにジャンプする命令
例
JMP entry
MOV命令
簡単に言えばコピー、主にレジスタに数値を代入したりするのに使う(ビット数が同じもの限定)
例
MOV AX, 0
ADD命令
加算命令、第二オペランドと第一オペランドを加算し第一オペランドに代入
例
ADD SI,1
CMP命令
比較命令、ジャンプ命令とセットでif文のような動きをする。結果はフラグレジスタへ…
JE命令
条件ジャンプ命令、比較の結果としてのフラグレジスタを参照しラベルにジャンプする 例
CMP AL,0 JE fin
INT命令
ソフトウェア割り込み命令、BIOS関連
HLT命令
CPUを休ませる命令、デバッグ例外、INT命令、RESET命令で再開する
文法に関してのまとめ
ラベル
MOV SI,msg
これはmsgラベルのアドレスを代入しているだけ
[]
MOV AL,[SI]
このSIに入っているアドレスを使って、メモリからデータをもってこよう!ってこと
この際にBYTE、WORD、DWORDを指定する(MOV命令等でBYTEしかありえないときは省略できる)。
例
MOV BYTE [678],123
これは678番地に123を代入
メモリマップ
参考:(AT)memorymap - os-wiki
これを見て、メモリで使ってはいけないところ等を確認する。
レジスタに関してのまとめ
レジスタ名 | 役割 |
---|---|
AX(アキュームレータ) | 算術演算に特化 |
CX(カウンタ) | 数を数えるのに特化 |
DX(データ) | 算術演算とI/O操作(インプット、アウトプット)に使用 |
BX(ベース) | 算術演算とセグメントモードでのDSのデータの指定 |
SP(スタックポインタ) | スタックのトップを示す |
BP(ベースポイン) | スタックのベースを示す |
SI(ソースインデックス) | ストリーム操作でのソースへのポインタ |
DI(ディスティネーションインデックス) | ストリーム操作でのディスティネーションへのポインタ |
・これらは16ビットのレジスタとなり、それぞれの役割に従って使ってあげると命令のバイト数が少なく済む。
・8バイトのレジスタもあり、AH、AL、CH、CL、DH、DL、BH、BLと呼ばれる。
・BP、SP、SI、DIはハイとロウがないので、AXとMOV命令等で実現する。
・セグメントレジスタは三日目
個人的メモ
・メモリはレジスタより何倍も遅いことを意識したプログラム作り
プログラムの実行
ながれとしては
toolsetにharibote4のファイルをコピぺする
⇓
!cons_nt.batをダブルクリック
⇓
cmdが立ち上がるので、asm⇒makeimg⇒run(Makefileがあるとmake runだけでいい)と入力すればできる。
注:qemuでマウスが消えたと思ったらCtrl+Alt+g
MakeFileの作成
MakeFile⇒バッチファイルの上位互換みたいなもの
記号の説明
種類 | 説明 |
---|---|
# | コメント |
<ファイル名> : <ファイル名> | 左のファイルを生成したい場合は右のファイルがあるか確認する |
¥ | 次の行にまたがって書いたということ |
2日目感想
今のところは写経ミス以外は順調に進んでいます(白目)。にしても、アセンブリの開発やMakefileまで知れて、早くやり始めてたらなぁと思うばかりです。
参考文献
Tips IA32(x86)命令一覧 Hから始まる命令 HLT命令
X86アセンブラ/x86アーキテクチャ - Wikibooks
もう一度基礎からC言語 第10回 制御構造と変数(6)~if、for、whileをアセンブリ言語で 値を調べ処理を切り替える