個人用雑記

勉強したことを書いていければなーと

30日でできる!OS自作入門(Day 2)

テキストエディタの紹介

2日目の冒頭はテキストエディタの紹介としてTeraPadがおすすめされていました。僕のおすすめはVScodeです。

それが言いたかっただけです。

1日目のアセンブラ続き

今の知識量ではまだソースコードのほんの一部分しか理解できないので、とりあえずそのわかる部分をより分かりやすいアセンブラにしていく。
アセンブラの命令の内容がつらつらと書かれているけれど、ある程度は英単語から取られているからそれなりには理解できるなーといった感じ。MOV(E)とかADDとかC(O)MP(ARE)とかとか。(この辺は以前使ったKUE-CHIP2という教育用マイコンアセンブラと似たような命令だったから直感的にもわかりやすい。)

ソースコードを読むと、どうやら画面に出力したい内容をプログラムの下の方に書いておいて、そこから一文字ずつ読んで画面に表示して次の文字に移動ということを繰り返している感じらしい。ただこのままだとプログラムが終了しないから一応0を置いておいて0だったら終了、つまりHLT命令に移動するようにしているっぽい。

こういうソースコードで何をしているかがわかったら、次にやることはとりあえず改変して遊ぶことだと思っているので、やってみました。
f:id:rei_624:20190409013233p:plain

見事に失敗しました。(「"」の出力のためにわざわざアスキーコード調べたのに・・・)
ぶっちゃけ直す方法は全くわからないですけど、今はそれでいいような気がするのでとりあえず失敗できたということを喜ぶ感じで・・・(原因はおそらく改行した時に前の行の終わりのところが次の行の開始になるからだと考えてます。)

[追記](2019.4.09)
一応バックスペースのアスキーコードを戻したい回数表示することで解決はしました。(少なくとも正規の解決方法ではない。)
それともデフォルトの改行の仕様は同じ位置の1行下から始めることになっていて、自動的に左側に戻してくれる機能はOSで実装されているとか・・・?
f:id:rei_624:20190409144841p:plain

[再追記]
解決しました。Windowsの改行コードはCRLFに対してLinuxの改行コードはLFだからGitHubなんかで共同で作業しようとすると困る!という話を耳にしたことはあっても、CRLFとLFの違いについては調べなかったのがあだになった感じ・・・
アスキーコード表の0x0d(=CR、キャリッジリターン)がカーソルを文頭に持ってくれる文字コードのようで、WindowsのCRLFというのはカーソルを先頭に持ってきて改行、Linuxではカーソルを先頭に戻さずに改行という意味で異なっているっぽい。
今回みたいに次の行で先頭から始めたい場合はDB 0x0d, 0x0aのようにCRしてからLFすることで解決できるみたい。

イメージファイルをブートセクタだけにする

OSは起動時に冒頭512バイトしか読み込めないから、まずはその512バイト部分にあたるブートセクタをとりあえずアセンブラで書かなければならない。とはいえ今までのソースコード自体にこのブートセクタ部分は含まれていたので、むしろ余計な部分を除いて最もすっきりとしたソースコードにしたという感じ。

Makefileの準備

毎回毎回naskでアセンブラコンパイラして(Virtual Boxでは必要ないけれど)それをディスクイメージとして焼いて・・・といった諸々のコマンドを一つのコマンドでできるようにMakefileを作る。自分の環境では精々naskで.nasファイルをコンパイラするだけなので必要ないかなーという感じ・・・(Virtual Boxの立ち上げまでやってくれるMakefileなら需要はあるかもしれない。)

Day 3へ

3日目の最初を見る限り内容がかなり濃そうなのでゆっくり数日かけて読んでいきたいなーと思います。
アセンブラ、よかったですね。