「OSを作れる」「仕組みが学べる」という言葉に惹かれて、プログラミング軽くかじった程度の私が、OSを自作しようと思い立ちました。

2019年の目標の一つは『OS自作入門でOSを作る』です。

目標を次のように設定。

「2019年3月31日までに、完読してわからないなりにもOSを自作してみよう。」

 

 

さて、3日目にして、「バイナリエディタ」から「アセンブラ」での開発に進み、入力した内容も機械語からプログラムっぽくなったらしいです。

 

残念ながら、その「それっぽいソースプログラム」が私にはなかなか理解できなくて、何をどう変えたのかわからずに、ずっとにらめっこしている状況なのです。

ひとまず、3日目の残りの部分だけメモします。

 

「;」:コメント命令。C言語での「//」と同じ。コメントをつけられる。

「DB命令のあたらしい使い方」:文字列を書ける。

「DW命令」「DD命令」:それぞれ「data word」「data double-word」。ワードが2バイトで16ビット、ダブルワードが4バイトで32ビット。
DW 0000 0000
DD 0000 0000 0000 0000

「RESB 0x1fe-$」:(「$」この行が先頭から何バイト目かを教えてくれる変数。)だから、0x1feから$分引いて、その分(バイト)の00を並べてね。

 

 

さて、ここからChapter2へ入るわけですが、「プログラム」がさらに書き換えられてしまっていた。おかげで新出命令が続出。

はじめてのこととわからないことは、とにかく書き出します。

間違っているかもしれませんが、とにかく現時点での理解でメモしておく。間違っていたことがわかったら追記していきます。

 

あー、不安でしかない。

 

<新出命令>

「ORG命令」:この機械語が実行時にPCのメモリのどこに読み込まれるかを教えてあげる。この命令では「$」の意味が読み込まれる予定のメモリの番地となる。

「JMP命令」:C言語でのgo to文。メモリの番地を示すのが基本形。

「entry」:ラベルの宣言。JMP命令の飛び先の指定などに使われる。

「MOV命令」:代入。MOV AX, 0は、AX = 0という代入文。
「MOV SI, msg」:msgはラベル。

「ADD命令」:足し算命令。ADD SI, 1は SI = SI + 1

「CMP命令」:比較命令。CMP a, 3と書いて、どれとどれを比較するのか、そして次にどうして欲しいかを書く。

「INT命令」:ソフトウェアの割り込み命令。

「HLT命令」:CPUを停止させる命令。待機させる。

 

「0x7c00」を指定した理由。

0x00007c00 – 0x00007dff: ブートセクタが読み込まれるアドレス

 

 

<レジスタについて。>

CPUには、レジスタという記憶回路がある。

IT用語辞典「レジスタ」
「レジスタとは、マイクロプロセッサ(MPU/CPU)内部にある、演算や実行状態の保持に用いる記憶素子。最も高速な記憶装置だが、一般的なCPU製品で数個から数十個(容量に換算して数十バイト程度)と数が限られる。」

  • AX:アキュムレータ(accumulator :累積演算機という意味)
  • CX:カウンタ(counter:数を数える機械という意味)
  • DX:データ(data:データという意味)
  • BX:ベース(base:土台とか基点という意味)
  • SP:スタックポインタ(stack pointer:スタック用ポインタ)
  • BP:ベースポインタ(base pointer:ベース用ポインタ)
  • SI:ソースインデックス(source index:読み込みインデックス)
  • DI:デスティネーションインデックス(destination index:書き込みインデックス)

これらはすべて16ビットレジスタ。16桁の2進数を記憶できる。

各種の演算には、AXを使うようにすると、プログラムが簡潔に書ける。
ADD CX, 0x1234 は 81 C1 34 12 という4バイトの命令だが、
ADD AX, 0x1234 は 05 34 12 という3バイトの命令。

?????

現時点で、なぜこうなるのかわかりません。。。

 

8ビットのレジスタも8個ある。

  • AL:アキュムレータロウ(low;低い)
  • CL:カウンタロウ
  • DL:データロウ
  • BL:ベースロウ
  • AH:アキュムレータハイ(high:高い)
  • CH:カウンタハイ
  • DH:データハイ
  • BH:ベースハイ

AXのレジスタのうち、下の位のビット0から7の8ビットの部分をALという。上の位の8ビットの部分をAH。BP, SP, SI, DIは分けられない。

32ビットレジスタもある。

EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI

 

セグメントレジスタ(16ビットレジスタ)というのもある。

  • ES:エクストラセグメント(extra segment:おまけセグメント)
  • CS:コードセグメント(code segment)
  • SS:スタックセグメント(stack segment)
  • DS:データセグメント(data segment)
  • FS:本名なし(おまけセグメントパート2)
  • GS:本名なし(おまけセグメントパート3)

 

<メモリについて>

MOV AL, [SI]と書いた場合、[]は「メモリ」を意味する。

MOV命令では、転送先や転送元にレジスタや定数だけでなく、メモリを指定することもできる。

MOV BYTE [678], 123 メモリの678番地に、123を記憶させる命令。BYTEと指定してるので8個。

MOV WORD[678], 123 メモリの678番地と、お隣の679番地に123を記憶させる。WORDなので16ビット。123は16ビットの数値として解釈されて、00000000001111011 となり、下の678番地へ01111011、上の679番地へ00000000が送られる。

メモリのSI番地の1バイトの内容をALに読み込めは、

MOV AL, BYTE [SI]

ALはBYTE以外ありえないので、

MOV AL, [SI]

と省略できる。

 

◆ ブートセクタだけを作るように整理する。

ディスクイメージ全体を作るのではなく、naskで512バイトのブートセクタを作って、 残りをディスクイメージ管理ツールでつくる。

というやり方にするようです。

!cons → asm →makeimg → run

 

◆ Makefileの導入

これを導入すると、シンプルになるらしい・・・。

make runで実行できた。

なにがどうなったのか、うまく書き出せない。

 

どんどこ進みます。。。

以上。

スポンサーリンク