adr アドレス (adr) アドレスadrのデータ R SP(p) or BP(bp) pc プログラムカウンタ p スタックポインタ(値が入っているトップを指す) s[p] pが示すスタックの値 bp ベースポインタ(スタック上の特定の位置を指す) ※spとbpの初期値は、スタックボトム-1である 命令 NOP 無実行 ADD s[p-1]=s[p-1]+s[p], p=p-1 ex) [n,2,3]->[n,5] SUB s[p-1]=s[p-1]-s[p], p=p-1 MUL s[p-1]=s[p-1]*s[p], p=p-1 DIV s[p-1]=s[p-1]/s[p], p=p-1 CMPEQ if s[p-1]==s[p] then s[p-1]=1 else s[p-1]=0, p=p-1 ex) [n,x,x]->[n,1] CMPNE if s[p-1]!=s[p] then s[p-1]=1 else s[p-1]=0, p=p-1 ex) [n,x,x]->[n,0] CMPLE if s[p-1]<=s[p] then s[p-1]=1 else s[p-1]=0, p=p-1 CMPLT if s[p-1]< s[p] then s[p-1]=1 else s[p-1]=0, p=p-1 CMPGE if s[p-1]>=s[p] then s[p-1]=1 else s[p-1]=0, p=p-1 CMPGT if s[p-1]> s[p] then s[p-1]=1 else s[p-1]=0, p=p-1 JP adr pc=adr JPT adr if s[p]!=0 then pc=adr, p=p-1 JPF adr if s[p]==0 then pc=adr, p=p-1 DEL p=p-1 LDS s[p]=(s[p]),p=p ex) [n,5]->[n,5番地のデータ] LDA adr s[p+1]=adr,p=p+1 ex) [n]->[n,adr] LDA offset[R] s[p+1]=R+offset,p=p+1 LDI dat s[p+1]=dat,p=p+1 ex) [n]->[n,dat] STS (s[p-1])=s[p],s[p-1]=s[p],p=p-1 ex) [n,adr,dat]->[n,dat] (adr番地)=dat ※datが残ることに注意 PRT p=p-1 ex) [n,dat]->[n] PRINT dat INP s[p+1]=dat,p=p+1 ex) [n]->[n,dat] INPUT dat LEASP offset[R] p=R+offset ex) LEASP 1[SP] -> p=p+1 LEABP pffset[R] bp=R+offset PUSH sp[p+1]=bp,p=p+1 POP bp=sp[p],p=p-1 CALL adr sp[p+1]=pc+1(次命令アドレス),p=p+1 RET pc=sp[p],p=p-1 STOP 停止 実行例1 ; a = 2*(3+4) _VAR _a$ INT 0 ;初期値 0 _END_VAR _PROG LDA _a$; [adr(a)] LDI 2; [adr(a),2] LDI 3; [adr(a),2,3] LDI 4; [adr(a),2,3,4] ADD ; [adr(a),2,7] MUL ; [adr(a),14] STS ; [14] DEL ; [] STOP _END_PROG 実行例2 ; a ;変数参照 _VAR _a$ INT 4 ;初期値 4 _END_VAR _PROG LDA _a$; [adr(a)] LDS ; [4] STOP _END_PROG 実行例3 ; if(cond) stmt L_START: cond処理 JPF L_END stmt処理 L_END: 実行例4 ; if(cond) stmt1 else stmt2 L_START: cond処理 JPF L_ELSE stmt1処理 JP L_END L_ELSE: stmt2処理 L_END: 実行例5 ; while(cond) stmt L_START: cond処理 JPF L_END stmt処理 JP L_START L_END: