Next: プログラミング, Previous: SimpleProcessor, Up: Top

## 2 命令コード

SimpleProcessorの命令列は，32bit固定長であり，以下のような内容で構成される．

`命令 rD,rN,rM`
  8bitの命令と，レジスタ番号rD，rN，rM．
`命令 rN,rM`
  8bitの命令とレジスタ番号，rNとrM．
`命令 rN`
  8bitの命令とレジスタ番号，rN．
`命令 rD,imm`
  8bitの命令とレジスタ番号，16bitの即値imm．
`命令 imm`
  8bitの命令と16bitの即値imm．

`HALT`
  プログラムの終了を指示します．この命令を読みこむと，SimpleProcessorはプログラムカウンタを進めません．
`NOP`
  何もせず，プログラムカウンタを更新します．
`ADD rD,rN,rM`
  レジスタDにレジスタNの内容とレジスタMの内容の和を代入します．
`ADDI rD,imm`
  レジスタDにレジスタDの内容と即値immを加算した結果を代入します．
`SUB rD,rN,rM`
  レジスタDにレジスタNの内容とレジスタMの内容の差を代入します．
`SUBI rD,imm`
  レジスタDにレジスタDの内容から即値immを引いた値を代入します．
`MULT rD,rN,rM`
  レジスタNとレジスタMの積を求め，その下位16bitをレジスタDに，上位16bitをレジスタ(D+1)に代入します．
`DIV rD,rN,rM`
  レジスタNとレジスタMの除算を行い，その商をレジスタDに，余を16bitをレジスタ(D+1)に代入します．
`OR rD,rN,rM`
  レジスタDにレジスタNとレジスタMの各ビットでの論理和を代入します．
`AND`
  レジスタDにレジスタNとレジスタMの各ビットでの論理積を代入します．
`JMP rN`
  レジスタNのアドレス番地にプログラムカウンタをセットします．
`JMPI imm(16bit)`
  即値で指定したアドレス番地にプログラムカウンタをセットします．
`JCC rN`
  SimpleProcessor内のconditionフラグが真の場合にレジスタNのアドレス番地にプログラムカウンタをセットします．
`JCCI imm`
  SimpleProcessor内のconditionフラグが真の場合にimm番地にプログラムカウンタをセットします．
`EQ rD,rN,rM`
  レジスタNとレジスタMの値が等しい場合にconditionフラグを真にし，レジスタDに0を代入する．
`NEQ rD,rN,rM`
  レジスタNとレジスタMの値が等しくない場合にconditionフラグを真にし，レジスタDに0を代入する．
`LT rD,rN,rM`
  レジスタNがレジスタMより小さい場合にconditionフラグを真にし，レジスタDに0を代入する．
`GT rD,rN,rM`
  レジスタNがレジスタMより大きい場合にconditionフラグを真にし，レジスタDに0を代入する．
`LEQ rD,rN,rM`
  レジスタNがレジスタM以下の場合にconditionフラグを真にし，レジスタDに0を代入する．
`GEQ rD,rN,rM`
  レジスタNがレジスタM以上の場合にconditionフラグを真にし，レジスタDに0を代入する．
`LDR rN,rM`
  レジスタNの番地のデータを読み込み，レジスタMに代入する．外部Channelへのリクエストの場合，writeback()でレジスタMにデータは書き戻される．
`STR rN,rM`
  レジスタNの番地にレジスタMのデータを書き込む．
`MOV rD,rN`
  レジスタNの値をレジスタDに転送する．
`MOVI rD,imm`
  レジスタDに即値immを転送する．
`POP rD`
  スタックからデータをpopし，レジスタDに転送する．
`PUSH rN`
  スタックにレジスタNの値をpushする．
`CALL rN`
  レジスタN番地からの命令を呼び出す．現在のプログラムカウンタはスタックにpushされる．
`CALLI imm`
  即値imm番地からの命令を呼び出す．現在のプログラムカウンタはスタックにpushされる．
`RET`
  スタックから値をpopし，その値をプログラムカウンタとする
`LDA rD,imm`
  フレームポインタの値から即値immで指定したオフセット位置の番地の値を読み込みレジスタDに書き込む．
`STA rN,imm`
  フレームポインタの値から即値immで指定したオフセット位置の番地にレジスタNの値を書き込む．