本CPUは、鹿児島高専の授業「言語処理系」でコンパイラの動作を説明するために設計したCPUです。
メモリは、1番地から1000番地まであります。1つの番地には1命令(オペランドおよびオペコードを含む)または、1つのデータが入ります。データは整数のみです。実際のPUでは、1つの命令が複数番地を利用したり、1つのデータが同様に複数番地を利用したりします。
- メモリの番地は1番地から1000番地まで
- プログラムコード領域は、800番地まで。
- ヒープ領域(大域変数領域)は、801番地から。
- スタック領域は、1000番地から下がる方向で。
汎用レジスタはA,B,Cの3つがあります。レジスタにはデータが格納される場合もありますし、番地情報が入る場合もあります。また、後述の演算命令は、すべてレジスタAの内容とレジスタBの内容を演算し、演算結果をレジスタCに代入するとします。
汎用レジスタ以外では
- PC (プログラムカウンタ) 実行する命令の番地を格納
- SP (スタックポインタ) PUSHやPOP命令等スタック操作時に利用されます。
- FP (フレームポインタ) スタックフレームを作成する場合に使用します。
があります。
基本的に
- メモリからレジスタへの代入はLOAD
- レジスタからメモリへの代入はSTORE
です。
命令 | 使用法 | 意味 |
---|---|---|
LOAD | LOAD reg1, 数字 LOAD reg1, reg2 LOAD reg1, #(addr) |
第2引数で示される値を第1引数の reg1 に代入する |
STORE | STORE reg1, #(addr) | 第1引数の reg1 の値を第2引数の#(addr)で示されるメモリ番地に書き込む |
スタックの動作はフルスタック(Full Stack)の下降方向(Decrement)とします。
命令 | 使用法 | 意味 |
---|---|---|
PUSH | PUSH reg1 | reg1の内容をスタックに積む。積まれる前にSP値が変化する (具体的にはSP←SP-1) |
POP | POP reg1 | スタックから値を取り出し reg1 に代入する。値を取り出した後、SP値が変化する (具体的にはSP←SP+1) |
PUSHUP | PUSHUP | SP値をスタック領域が増える方向に1つ移動する(具体的にはSP←SP-1) |
JMP, JPC,CALL命令の第1引数はジャンプ先のメモリ番地を表します。RET命令の引数はこれらと意味が違うことに注意
命令 | 使用法 | 意味 |
---|---|---|
JMP | JMP 数字 | 無条件に数字番地にジャンプする |
JPC | JPC 数字 | レジスタCが0(偽)ならば、数字番地にジャンプする |
CALL | CALL 数字 | 現在のPCの値 (CALL命令の番地) の次の値をスタックに積んで、 数字番地にジャンプする |
RET | RET 数字 | POP操作を行い、その値を帰り番地としてジャンプする。 その後、さらに第1引数の数字分だけスタック領域が減る方向にSP値を変化させる(具体的にはSP←SP+数字) |
レジスタAの内容とレジスタBの内容で算術演算を行う。結果はレジスタCに代入される。
命令 | 使用法 | 意味 |
---|---|---|
PLUS | PLUS | A+B |
MINUS | MINUS | A-B |
MULTI | MULTI | A×B |
DIV | DIV | A÷B |
レジスタAの内容とレジスタBの内容を比較し、結果が真の場合はレジスタCが1となる。それ以外の場合はレジスタCは0となる。 CMPODDのみがレジスタAのみで判断される。
命令 | 使用法 | 意味 |
---|---|---|
CMPODD | CMPODD | Aが奇数ならば、真となる |
CMPEQ | CMPEQ | AとBが同じ値ならば、真となる |
CMPNOTEQ | CMPNOTEQ | AとBが違う値ならば、真となる |
CMPLT | CMPLT | A < Bならば、真となる |
CMPGT | CMPGT | A > Bならば、真となる |
CMPLE | CMPLE | A <= Bならば、真となる |
CMPGE | CMPGE | A >= Bならば、真となる |
命令 | 使用法 | 意味 |
---|---|---|
PRINT reg1 | 画面にreg1の内容を表示する | |
PRINTLN | PRINTLN | 画面上で改行を行う |
END | END | プログラムを停止する |