「30日で出来る! OS自作入門」を30日で作らない -大脱線編-

なにが起こったの?

この先暇だと思っていたら、意外と別件で開発するものが出てきたのであんまり時間を割きたくなくなりました。

(一応言っておくと、プロセッサの論理設計をしてます。多分半年とちょっと先に学校で発表します。)

それで、どうするの?

でもなんとなく遊ぶことにします。
そういうわけで、多分「大脱線編」のバージョンがひたすらあがっていくと思います。

多分、OSが完成する方向には向きません。

で、本題です。

プロセサを開発してるときに、

「そういえば自己書き換えプログラムってあるよね」

って思いました。
しかし、ハーバードアーキテクチャを採用してるプロセサ、つまり大半のx86プロセサでは実現が難しそうだなと思ったんですよ。

で、調べてみたら、互換性のために実行がサポートされているという記述を見つけたので、ほんとに動くかどうかipl.nasを改造して確かめてみました。

    MOV     AX,0        ;以下レジスタ初期化
    MOV     SS,AX
    MOV     SP,0x7c00
    MOV     DS,AX
    MOV     ES,AX

    MOV     AL,0x40     ;ALは表示させる文字。

putloop:
    INC     AL          ;AL++
    CMP     AL,0x40     ;if(AL==0x40)
    JE      fin         ;    goto fin
    MOV     AH,0x0e     ;以下はBIOSを使って出力するための命令
    MOV     BX,15
    INT     0x10
    CMP     AL,0x5a     ;if(AL==0x5a)
    JZ      rewrite     ;    goto rewrite
    JMP     putloop     ;goto putloopでループ
fin:
    HLT                 ;CPU状態を停止にする。
    JMP     fin            ;理由は詳しく知らないけど、無いと
                        ;CPUが時々突然動き出す。
rewrite:
    MOV     CX,0xC8FE   ;CXに0xC8FEを代入
    MOV     [putloop],CX;putloopフラグのポインタにCX代入
    JMP     putloop     ;putloopに戻る

やってることはとても単純で、

putloopフラグ直下のINC ALを、rewriteフラグでCXに代入している0xC8FEで上書きしているだけです。

x86では0xC8FEは"DEC AL"になります。つまり、ALレジスタのデクリメントです。

プログラムは、0x41(ASCIIコードで"A")から0x5a(ASCIIコードで"Z")まで表示し、デクリメントに自己書き換えをしてまた0x41まで帰り終了します。
出力はまぁこんな感じですね。

ABCDEFGHIJKLMNOPQRSTUVWXYZZYXWVUTSRQPONMLKJIHGFEDCBA

そういうわけで

まぁ別にブログに書くほど有用な内容ではないのですけれど、
自分の知的好奇心は満たせたので満足です。

今後はこういう感じに適当にやったことを書いていくことにします。
定期的に同じことを書くなんて、俺には100年早かったってことです。

まぁ、とりあえずはOS本のtolsetを使ってハードウエアをたたき続けて遊ぶのかな? 多分そういう方向になっていくと思いますはい。