Next: , Previous: 命令コード一覧, Up: Top


3 プログラミング

3.1 アセンブリ言語書式

3.1.1 命令列の構成

命令列は,命令とラベルから成る. ラベルは,ラベル:と行頭からはじまり:でおわる. また命令列は

命令 オペランド,オペランド,オペランド

と命令の後の空白に続いて必要なオペランドを,で区切って列挙する.オペランドに用いられる文字列を次に示す.

レジスタ番号
レジスタ番号を指定するためには,プリフィクスとしてrを指定して,r0のように記述する.
数値
数値は即値として扱われる.
ラベル
文字列は,ラベルとして処理される.使用するラベルは,既に宣言済みでなければならない.

3.2 スタックの使い方

SimpleProcessorでは,内部に持っているスタックを利用することができる.これは,PUSHPOPだけではなく,CALLCALLIおよびRETを実行する場合にも使用される.そのため,これらを命令を使用する場合には,スタックポイインタを予じめ適切に設定しておく必要がある.そのコードは,たとえば,次の通り.

     
     	movi	r29,2047
     

ここでは,2047番地をスタックのトップとしているが,メモリの大きさなどによって,この値は変わるべきである.

3.3 フレームポインタ

フレームポインタは,LDASTA命令でアクセスする際のオフセットの起点となるアドレスである.関数呼び出し等と連携して有用に活用するためには,初期状態として,スタックポインタと同一の値にしておくのが望ましい.

3.4 関数呼び出しの方法

関数呼び出しの際には,呼出し元のレジスタの退避,復帰アドレスなどを適切に設定する必要がある.次に示すのは,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命令でアクセスす\ることでローカル変数を簡単に扱うこともできる.