よもぎのOS自作入門 20日目/30日
はじめに
これは2020年夏休み企画「30日でOS自作してみよう!」20日目の記事です。
企画についてはこちら
昨日やったことを書いていきます。
昨日の進捗
実行可能なファイルを呼び出してアプリケーションとして実行できるようにしました。
昨日やったこと
今回は説明するのがちょっと難しい気がします。
文字をコンソール画面上に表示するシステムコール*1を作り、アプリケーションから呼び出してみようというのが目標です。
アプリケーションで表示したい文字をレジスタに入れても、OSが用意している文字表示機能は受け取れないので*2、レジスタに入れられた値をスタックに積むアセンブラを用意します。
最初エラーが発生していますが、OSの領域とアプリケーションの領域ではセグメンテーションが違うので、意識してCALL
命令やRET
命令をfar-CALL
命令やfar-RET
命令に置き換えます。
このシステムコールはmakeして、関数のマッピングを見て直接呼び出すメモリ番地を指定していましたが、 それだとOSに手を加えるたびにその値を変えなきゃいけなくなっちゃう。 回避方法としてIDT*3に登録します。
また、コマンドにない文字列を入力してEnterを押すと、その文字列をファイル名とする実行可能なファイルを実行するようにも変えました。
いままではhlt.hrb
という名前をハードコーディングしていました。今回はhello.hrb
という名前です。
拡張子があってもなくても.hrb
形式のファイルを実行します。
また先程は文字を表示するだけだったシステムコールを拡張して、文字列を表示するシステムコールも追加しました。 が、一部うまく行かないみたいなことがあって仕様なので、次回以降の課題です。
;hello.nas [INSTRSET "i486p"] [BITS 32] MOV ECX,msg MOV EDX,1 ;_put_charを指定 putloop: MOV AL,[CS:ECX] CMP AL,0 JE fin INT 0x40 ;syscall ADD ECX,1 JMP putloop fin: RETF msg: DB "Hello world!",0 ;hello2.nas [INSTRSET "i486p"] [BITS 32] MOV EDX,2 ;_put_strを指定 MOV EBX,msg INT 0x40 ;syscall RETF msg: DB "Hello world!",0
今日も一日頑張るぞい!