命令列は,命令とラベルから成る.
ラベルは,ラベル:
と行頭からはじまり:
でおわる.
また命令列は
命令 オペランド,オペランド,オペランド
と命令の後の空白に続いて必要なオペランドを,
で区切って列挙する.オペランドに用いられる文字列を次に示す.
レジスタ番号
r
を指定して,r0
のように記述する.
数値
ラベル
SimpleProcessorでは,内部に持っているスタックを利用することができる.これは,PUSH
やPOP
だけではなく,CALL
,CALLI
およびRET
を実行する場合にも使用される.そのため,これらを命令を使用する場合には,スタックポイインタを予じめ適切に設定しておく必要がある.そのコードは,たとえば,次の通り.
movi r29,2047
ここでは,2047番地をスタックのトップとしているが,メモリの大きさなどによって,この値は変わるべきである.
フレームポインタは,LDA
やSTA
命令でアクセスする際のオフセットの起点となるアドレスである.関数呼び出し等と連携して有用に活用するためには,初期状態として,スタックポインタと同一の値にしておくのが望ましい.
関数呼び出しの際には,呼出し元のレジスタの退避,復帰アドレスなどを適切に設定する必要がある.次に示すのは,1引数の関数を呼び出す場合の単純な方法である.戻り値はレジスタで返すものとしている.
push r0 ; 退避したいレジスタをスタックに積む
push r5 ; 関数の引数をスタックに積む
calli _func ; ラベルを指定する場合,接頭辞に'_'が必要
addi r29,1 ; 引数の分だけスタックポインタを戻す
...
func:
push r30 ; フレームポインタをスタックに積む
mov r30,r29 ; スタックポインタを新しいフレームポインタとする
addi r29,-2 ; この関数内で使う変数を保持する領域をスタック上に作る(ここでは,2ワード分確保)
lda r5,2 ; 関数の引数はフレームポインタ+2の位置にある.ちなみに+0は\\戻りアドレス,+1は旧フレームポインタ
...
mov r29,r30 ; スタックポインタをフレームポインタに戻す
pop r30 ; 旧フレームポインタをフレームポインタレジスタに書き戻す
ret ; 戻りアドレスに帰る
fpとspを活用して,関数のプロログ部分で,その関数で使用する変数を保持するために\\必要な分だけスタックポインタを減じ,空いたスタック領域にSTA/LDA命令でアクセスす\ることでローカル変数を簡単に扱うこともできる.