Skip to content
This repository has been archived by the owner on Mar 6, 2023. It is now read-only.

Latest commit

 

History

History
94 lines (66 loc) · 4.26 KB

instruction-set.md

File metadata and controls

94 lines (66 loc) · 4.26 KB

概要説明

本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
  • レジスタからメモリへの代入は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 PRINT reg1 画面にreg1の内容を表示する
PRINTLN PRINTLN 画面上で改行を行う
END END プログラムを停止する