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まで知れて、早くやり始めてたらなぁと思うばかりです。

参考文献

hikalium.com

Tips IA32(x86)命令一覧 Hから始まる命令 HLT命令

X86アセンブラ/x86アーキテクチャ - Wikibooks

もう一度基礎からC言語 第10回 制御構造と変数(6)~if、for、whileをアセンブリ言語で 値を調べ処理を切り替える