補足資料#
SCコード命令一覧#
stack[]:スタック領域,sp:スタックポインタ,bs:ベースポインタ,pc:プログラムカウンタ
| # | SCコード | 意味 | スタック領域とレジスタに対する操作 |
|---|---|---|---|
| 1 | LDC a | load constant | sp++;t[sp]=a; |
| 2 | LDL a | load local | sp++;t[sp]=t[bs+a]; |
| 3 | LDG a | load global | sp++;t[sp]=t[a]; |
| 4 | LDLA a | load local addr | sp++;t[sp]=bs+a; |
| 5 | LDGA a | load global addr | sp++;t[sp]=a; |
| 6 | STL a | store local | t[bs+a]=t[sp];sp--; |
| 7 | STG a | store global | t[a]=t[sp];sp--; |
| 8 | STI | store at indexed addr | t[t[sp-1]]=t[sp];sp--;sp--; |
| 9 | IND a | indexed fetch | t[sp]=t[t[sp]+a]; |
| 10 | JMP L | jump | pc=L; |
| 11 | JPZ L | jump if zero | if(t[sp]==0){pc=L;}sp--; |
| 12 | ENT a | enter block | sp=bs+a; |
| 13 | MST | mark stack | sp++;t[sp]=bs;sp++; |
| 14 | CUP a※1 | call user procedure | t[sp-a]=pc+1;bs=sp-a-2;pc=t[bs]; |
| 15 | RET a※2 | return from function | sp=bs-a;pc=t[bs+2];bs=t[bs+1]; |
| 16 | BOP o※3 | binary operation | sp--;t[sp]=(t[sp])o(t[sp+1]); |
| 17 | UOP o※4 | unary operation | t[sp]=o(t[sp]); |
| 18 | IBS a | increment base | bs+=a; |
| 19 | HLT | halt |
※1 aは呼び出す関数の引数の数
※2 関数の返り値がvoid型のときa=1,int型の時a=0
※3 oは二項演算子(+ - * / > >= < <= ==等)
※4 oは単項演算子(+ - !等)
Javaバイトコード命令一覧#
stack[]:スタック領域,heap[]:ヒープ領域,
optop:スタック最上部を示すレジスタ,frame:制御領域を示すレジスタ,
vars:スタック最下部を示すレジスタ,pc:プログラムカウンタレジスタ
| # | 命令 | スタック領域とレジスタに対する操作 |
|---|---|---|
| 1 | bipush c | optop++;stack[optop]=c; |
| 2 | ldc a | optop++;stack[optop]=heap[a]; |
| 3 | iload a | optop++;stack[optop]=stack[vars+a]; |
| 4 | aload a | optop++;stack[optop]=stack[vars+a]; |
| 5 | istore a | stack[vars+a]=stack[optop];optop--; |
| 6 | astore a | stack[vars+a]=stack[optop];optop--; |
| 7 | iadd | optop--;stack[optop]=stack[optop]+stack[optop+1]; |
| 8 | imul | optop--;stack[optop]=stack[optop]*stack[optop+1]; |
| 9 | goto L | pc=L; |
| 10 | if_icmpne L | if(stack[optop]!=stack[optop-1]){optop-=2;pc=L} |
| 11 | if_icmpeq L | if(stack[optop]==stack[optop-1]){optop-=2;pc=L} |
| 12 | if_icmpge L | if(stack[optop]>=stack[optop-1]){optop-=2;pc=L} |
| 13 | if_icmpgt L | if(stack[optop]> stack[optop-1]){optop-=2;pc=L} |
| 14 | if_icmple L | if(stack[optop]<=stack[optop-1]){optop-=2;pc=L} |
| 15 | if_icmplt L | if(stack[optop]< stack[optop-1]){optop-=2;pc=L} |
| 16 | new X | optop++;stack[optop]=malloc(X); |
| 17 | dup | optop++;stack[optop]=stack[optop-1]; |
| 18 | invokespecial X※1 | stack[optop+v+1]=pc;stack[optop+v+2]=vars;stack[optop+v+3]=frame;vars =optop-p;frame=optop+v+1;optop=optop+v+4;pc=X; |
※1 vはクラスXのコンストラクタの局所変数の数,pはコンストラクタの引数の数