コンテンツにスキップ

補足資料#

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はコンストラクタの引数の数