アセンブラ
カーネルのコードを読み進めるには,アセンブリコードは避けて通れない.読むのに最低限必要そうな点を押さえておこう.
Plan9のアセンブラでは,PC(プログラムカウンタ),FP(フレームポインタ),SP(スタックポインタ),TOS(トップオブスタックレジスタ),SB(スタティックベースレジスタ)といった擬似レジスタを使うことができる.SBは耳慣れないが,プログラムの先頭アドレスを指しているレジスタで,グローバルデータや手続きはSBからのオフセットとして書かれる.また,x86の場合は,GASと同じくAT&A表記なので(ベル研だから当然だよね),次のような書き方になる.
MOVx src,dst
例えば,I/Oポートから1バイトのデータを読み込むinb (pc/l.s)は次のように定義されている.
TEXT inb(SB),$0 MOVL port+0(FP),DX XORL AX,AX INB RET
定義はTEXT擬似命令,関数名,そしてスタック上に確保されるバイト数(手でアセンブリを書く場合はゼロにするのが普通)の順に並んでいる.そして,0(FP)が第一引数になるのはわかるが,"port+"というプレフィックスは何だろうか.これは第一引数が何であるか示すためのコメントで出力される機械語は影響されないらしい.レジスタをスタックに退避するプロローグ処理がないけど,最終的にはどんなコードを吐くのかな.0(FP)はEBP相対に置きかえられるのだろうな.
(補足)32bitレジスタにアクセスする場合も、MOVLのように命令にサイズをポストフィックスしているので、レジスタの指定はeaxじゃなくてAXでOK。
詳しくは,A Manual for the Plan 9 assemblerを見て.