「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を使ってハードウエアをたたき続けて遊ぶのかな? 多分そういう方向になっていくと思いますはい。