📄 execute_2.cpp
字号:
#include "compiler.h"
extern INSTRUCTION codelist[];
int sp,ip,bx;
int stack[EXESTACKSIZ]={0};
int run(enum instruction f, int l, int a);
int execute(){
int tip;
ip = bx = 0;
do{
tip = ip ++;
run(codelist[tip].f,codelist[tip].l,codelist[tip].a);
}while(ip>0);
printf("\nProgram end normally!\n");
return 0;
}
int pushn(int n){
sp += n;
if(sp >= EXESTACKSIZ){
PRT_REPORT(RUN_STACK_OVERFLOW);
return TMNT;
}
return sp;
}
int popn(int n){
sp -= n;
return sp;
}
int push(int data){
stack[sp++] = data;
if(sp == EXESTACKSIZ){
PRT_REPORT(RUN_STACK_OVERFLOW);
return TMNT;
}
return 0;
}
int pop(){
sp --;
return stack[sp];
}
int getbx(int l,int b){
int bx = b;
if(l == 0)
return b;
while(l>0){
l+=stack[bx];
bx = stack[bx+1];
//l += satck[bx];
l--;
}
return bx;
}
int run(enum instruction f, int l, int a){
int t;
switch(f){
case LIT:
push(a);
break;
case LOD:
t = getbx(l,bx)+a;
push(stack[t]);
break;
case STO:
t = getbx(l,bx)+a;
stack[t] = pop();
break;
case CAL:
push(l);
push(bx);
push(ip);
pop();
pop();
pop();
bx = sp;
ip = a;
break;
case INT:
pushn(a);
break;
case JMP:
ip = a;
break;
case JPC:
if(!pop()){
ip = a;
}
break;
case OPR:
switch(a){
case 0:
ip = pop();
bx = pop();
pop();
break;
case 1:
stack[sp-1] = -stack[sp-1];
break;
case 2:
stack[sp-2] += stack[sp-1];
pop();
break;
case 3:
stack[sp-2] -= stack[sp-1];
pop();
break;
case 4:
stack[sp-2] *= stack[sp-1];
pop();
break;
case 5:
stack[sp-2] /= stack[sp-1];
pop();
break;
case 6:
stack[sp-1] %= 2;
break;
case 8:
stack[sp-2] = (stack[sp-2]==stack[sp-1]);
pop();
break;
case 9:
stack[sp-2] = (stack[sp-2]!=stack[sp-1]);
pop();
break;
case 10:
stack[sp-2] = (stack[sp-2]<stack[sp-1]);
pop();
break;
case 11:
stack[sp-2] = (stack[sp-2]<=stack[sp-1]);
pop();
break;
case 12:
stack[sp-2] = (stack[sp-2]>stack[sp-1]);
pop();
break;
case 13:
stack[sp-2] = (stack[sp-2]>=stack[sp-1]);
pop();
break;
case 14:
printf("%d",pop());
break;
case 15:
printf("\n");
break;
case 16:
push(0);
scanf("%d",&stack[sp-1]);
break;
}
break;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -