2014年10月5日日曜日

[OS作成]30日でできる!OS自作入門 4日目

やっと4日目だ。
4日目はパレットを設定し、デスクトップらしき画像を描画する。

 最初、全てのパレット設定が黒になってしまった。
table_rgbが指し示すアドレスが正しくないようだ。
こちらのブログ と同様にstaticを外したら、色が設定された。
tinyos.cのリスティングファイルを確認すると、staticを付けるとパレットの定義は、 dataセクションに格納されていた。
dataセクションのアドレスは boot.sで
 # +20 : .dataの初期値列がファイルのどこにあるか
 .int 0x10c8
と定義しているが、 リンカスクリプトでdataセクションのアドレスを設定し、 そのアドレスをboot.sにも設定すれば良いのだろうか。

qemuで実行した時のスクリーンショット。書籍と同じだ。


ソースが大きくなってきたのでgithubで公開する。こちらを参照。

アセンブラでC言語から呼べる関数を作るときの注意点

自由に使って良いレジスタ EAX,ECX,EDX だけ。
他のレジスタは値を変更してはならない。
戻り値はEAXレジスタに設定する。

オブジェクトファイルの逆アセンブル

objdumpコマンドを使う。
$ objdump -d func.o

func.o:     ファイル形式 elf32-i386

セクション .text の逆アセンブル:

00000000 :
   0: f4                    hlt    
   1: c3                    ret    

00000002 :
   2: 8b 4c 24 04           mov    0x4(%esp),%ecx
   6: 8a 44 24 08           mov    0x8(%esp),%al
   a: 88 01                 mov    %al,(%ecx)
   c: c3                    ret

GASでのEFLAGSレジスタのPUSH/POP

NASMでは、pushfd, popfd と書くが、GASではpushfl, popflと書く。

参考