Help us understand the problem. What is going on with this article?

コツコツやらない小6がvirtualboxで「30日でできる!OS自作入門」をやり遂げる話。2日目(中)

記事一覧

1日目 https://qiita.com/gorira_tatsu/items/0b5aec93aa74a8c89107
2日目(前) https://qiita.com/gorira_tatsu/items/c1ae1d15c2946a90e042

前回やった事

・helloos.nasに書いていた事を勉強した。
詳しくは前回の記事 https://qiita.com/gorira_tatsu/items/c1ae1d15c2946a90e042
Twitterはじめました https://twitter.com/GoriraTatsu
ビュワーが10000超えた(1日目)

開発再開

helloos.nas
; hello-os
; TAB=4

        ORG     0x7c00          ; このプログラムがどこに読み込まれるのか

; 以下は標準的なFAT12フォーマットフロッピーディスクのための記述

        JMP     entry
        DB      0x90

〜中略〜

; プログラム本体

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

次は....MOV命令のよう。MOV命令は代入ですね。自分の思ってる代入ってこんな感じなんですけどこれでいいんですかね?pythonですけど。

dainyuu.py
x=1
print(x)

と思って調べてみたらスクリーンショット 2019-11-19 16.25.48.png
なんていうのが出てきました。ネットの世界って優しいなぁ(アンチはいるけども)
あ、あと @totsugeki_taiさんが気軽に聞いてくださいって優しく言ってくれて本当嬉しかった。期待を裏切らないようにがんばろ。

MOV命令の元になった英語は「move」で、移動という意味なのだけど、意味が少し違うなあ。

代入している場所はcpuのレジスタという記憶回路。レジスタにはそれぞれ名前があって、代表的なのは
・AX - Accumulator(累積演算機という意味)
・CX - Counter(数を数える機械という意味)
・DX - Data(データはデータ←重要)
・BX - Base(土台とか基点という意味)
・SP - Stack Pointer(スタック用ポインタ)
・BP - Base pointer(ベース用ポインタ)
・SI - Source Index(読み込み用インデックス)
・DI - Destination Index(書き込みインデックス)
らしい。これらは全て16bitレジスタで、だから16桁の二進数まで記憶できるという事。レジスタにいろんな役割があるけどある程度はどのレジスタを使っても結果は同じだけど、各種の演算にAXを使うとプログラムが簡潔にかける。一例をあげると、

ADD CX,0x1234  は 81 C1 34 12 という4バイトの命令になるが
ADD AX,0x1234 は 05 34 12 という3バイトの命令になる。

この例で分かると思うけど、簡潔にかけるのは機械語(1日目に打ち込んだ16進数のやつ)であってアセンブラのソースプログラムの段階では見た目の差は全くない。ここら辺あやふやだった。

他のレジスタで言えば、CXは回数を数えるのに使うと便利になるようできているし、BXはメモリの番地計算の基点に使うと便利になるようになっている。他のものについても同様だ。レジスタを適材適所でうまく使っていけば、簡潔に書くことができる。

AX、CX、DX、BXの名前の由来には、Xに当たる略語が見当たらないが、このXは拡張(extend)という意味です。一体何が拡張なのかというと、昔はCPUはレジスタでは8bitが主流だった時代があって、それと比べると16bitのレジスタというのはすごいことだったらしい。それで「拡張されたよー」的なノリでXがついている。レジスタの並びがアルファベット順になっていないがこれは機械語における(16進数)レジスタ番号の順に並べたためらしい。

なお、8個のレジスタを全部合わせても16バイトにしかならない。つまりCPUに大きなデータを入力することは出来ないという事になる。スクリーンショット 2019-11-26 20.59.17.png

一方、cpuには8bitのレジスタも8個あります。

・AL - Accumulator low
・CL - Counter low
・DL - Data low
・BL - Base low
・AH - Accumulator high
・CH - Counter high
・DH - Data high
・BH - Base high

なんか名前が似ているが、これには理由があって、AXレジスタの16bitのうち、下の位のbit0からbit7の8bit部の部分をALという。また、上の位のbit8からbit15のつまり残りの8bitの部分をAHと言うらしい。(丸写し)
そんな訳で、レジスタが増えた、これでさらにcpuだけで8バイトも余計に記憶できるぞ、ばんざーい、と言うわけじゃなくて、相変わらず合計16バイトしか記憶できないわけです。cpuにはかなり記憶能力がないんですねーなるほど。

ちなみにBP、SP、SI、DIはLとH(lowとhigh)に分けられないのかな?って思う人もいるかもしれないけど、これが分けられない。どうしても〜って時はMOV AX.SIとかやって、その上でALとAHを使えって事だね。大体プログラミング代用説。

 /|_________ _ _
〈  To BE CONTINUED…//// |
 \| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄~ ~  ̄

次回 準備中
って言うか、丸写し多いな...次回もうちょっとオリジナリティを強めにするか。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away