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

## 3 プログラミング

### 3.1 アセンブリ言語書式

#### 3.1.1 命令列の構成

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

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

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

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

### 3.2 スタックの使い方

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

         	movi	r29,2047

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

### 3.3 フレームポインタ

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

### 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命令でアクセスす\ることでローカル変数を簡単に扱うこともできる．