¡¡¡¡/* ½âÊͳÌÐò */
¡¡¡¡void interpret()
¡¡¡¡{
¡¡¡¡¡¡int p,b,t; /* Ö¸ÁîÖ¸Õ룬ָÁî»ùÖ·£¬Õ»¶¥Ö¸Õë */
¡¡¡¡¡¡struct instruction i; /* ´æ·Åµ±Ç°Ö¸Áî */
¡¡¡¡¡¡int s[stacksize]; /* Õ» */
¡¡¡¡¡¡printf("start pl0\n");
¡¡¡¡¡¡t=0;b=0;p=0;
¡¡¡¡¡¡s[0]=s[1]=s[2]=0;
¡¡¡¡¡¡do
¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡i=code[p]; /* ¶Áµ±Ç°Ö¸Áî */
¡¡¡¡¡¡¡¡p++;
¡¡¡¡¡¡¡¡switch(i.f)
¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡¡¡¡¡case lit: /* ½«aµÄֵȡµ½Õ»¶¥ */
¡¡¡¡¡¡¡¡¡¡s[t]=i.a;
¡¡¡¡¡¡¡¡¡¡t++;
¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡¡¡¡¡case opr: /* Êýѧ¡¢Âß¼ÔËËã */
¡¡¡¡¡¡¡¡¡¡switch(i.a)
¡¡¡¡¡¡¡¡¡¡{
¡¡¡¡¡¡case 0:
¡¡¡¡¡¡¡¡¡¡¡¡t=b;
¡¡¡¡¡¡¡¡¡¡¡¡p=s[t+2];
¡¡¡¡¡¡¡¡¡¡¡¡b=s[t+1];
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡¡¡¡¡¡¡case 1:
¡¡¡¡¡¡¡¡¡¡¡¡s[t-1]=-s[t-1];
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 2:
¡¡¡¡¡¡¡¡¡¡¡¡t--;
¡¡¡¡¡¡¡¡¡¡¡¡s[t-1]=s[t-1]+s[t];
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 3:
¡¡¡¡¡¡¡¡¡¡¡¡t--;
¡¡¡¡¡¡¡¡¡¡¡¡s[t-1]=s[t-1]-s[t];
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 4:
¡¡¡¡¡¡¡¡¡¡¡¡t--;
¡¡¡¡¡¡¡¡¡¡¡¡s[t-1]=s[t-1]*s[t];
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 5:
¡¡¡¡¡¡¡¡¡¡¡¡t--;
¡¡¡¡¡¡¡¡¡¡¡¡s[t-1]=s[t-1]/s[t];
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 6:
¡¡¡¡¡¡¡¡¡¡¡¡s[t-1]=s[t-1]%2;
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 8:
¡¡¡¡¡¡¡¡¡¡¡¡t--;
¡¡¡¡¡¡¡¡¡¡¡¡s[t-1]=s[t-1]==s[t];
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 9:
¡¡¡¡¡¡¡¡¡¡¡¡t--;
¡¡¡¡¡¡¡¡¡¡¡¡s[t-1]=s[t-1]!=s[t];
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 10:
¡¡¡¡¡¡¡¡¡¡¡¡t--;
¡¡¡¡¡¡¡¡¡¡¡¡s[t-1]=s[t-1]<s[t];
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 11:
¡¡¡¡¡¡¡¡¡¡¡¡t--;
¡¡¡¡¡¡¡¡¡¡¡¡s[t-1]=s[t-1]>=s[t];
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 12:
¡¡¡¡¡¡¡¡¡¡¡¡t--;
¡¡¡¡¡¡¡¡¡¡¡¡s[t-1]=s[t-1]>s[t];
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 13:
¡¡¡¡¡¡¡¡¡¡¡¡t--;
¡¡¡¡¡¡¡¡¡¡¡¡s[t-1]=s[t-1]<=s[t];
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 14:
¡¡¡¡¡¡¡¡¡¡¡¡printf("%d",s[t-1]);
¡¡¡¡¡¡¡¡¡¡¡¡fprintf(fa2,"%d",s[t-1]);
¡¡¡¡¡¡¡¡¡¡¡¡t--;
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 15:
¡¡¡¡¡¡¡¡¡¡¡¡printf("\n");
¡¡¡¡¡¡¡¡¡¡¡¡fprintf(fa2,"\n");
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case 16:
¡¡¡¡¡¡¡¡¡¡¡¡printf("?");
¡¡¡¡¡¡¡¡¡¡¡¡fprintf(fa2,"?");
¡¡¡¡¡¡¡¡¡¡¡¡scanf("%d",&(s[t]));
¡¡¡¡¡¡¡¡¡¡¡¡fprintf(fa2,"%d\n",s[t]);
¡¡¡¡¡¡¡¡¡¡¡¡t++;
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡}
¡¡¡¡¡¡break;
¡¡¡¡¡¡case lod: /* È¡Ïà¶Ôµ±Ç°¹ý³ÌµÄÊý¾Ý»ùµØÖ·ÎªaµÄÄÚ´æµÄÖµµ½Õ»¶¥ */
¡¡¡¡¡¡¡¡¡¡¡¡s[t]=s[base(i.l,s,b)+i.a];
¡¡¡¡¡¡¡¡¡¡¡¡t++;
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case sto: /* Õ»¶¥µÄÖµ´æµ½Ïà¶Ôµ±Ç°¹ý³ÌµÄÊý¾Ý»ùµØÖ·ÎªaµÄÄÚ´æ */
¡¡¡¡¡¡¡¡¡¡¡¡t--;
¡¡¡¡¡¡¡¡¡¡¡¡s[base(i.l,s,b)+i.a]=s[t];
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case cal: /* µ÷ÓÃ×Ó¹ý³Ì */
¡¡¡¡¡¡¡¡¡¡¡¡s[t]=base(i.l,s,b); /* ½«¸¸¹ý³Ì»ùµØÖ·ÈëÕ» */
¡¡¡¡¡¡¡¡¡¡¡¡s[t+1]=b; /* ½«±¾¹ý³Ì»ùµØÖ·ÈëÕ»£¬´ËÁ½ÏîÓÃÓÚbaseº¯Êý */
¡¡¡¡¡¡¡¡¡¡¡¡s[t+2]=p; /* ½«µ±Ç°Ö¸ÁîÖ¸ÕëÈëÕ» */
¡¡¡¡¡¡¡¡¡¡¡¡b=t; /* ¸Ä±ä»ùµØÖ·Ö¸ÕëֵΪйý³ÌµÄ»ùµØÖ· */
¡¡¡¡¡¡¡¡¡¡¡¡p=i.a; /* Ìø×ª */
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case inte: /* ·ÖÅäÄÚ´æ */
¡¡¡¡¡¡¡¡¡¡¡¡t+=i.a;
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case jmp: /* Ö±½ÓÌø×ª */
¡¡¡¡¡¡¡¡¡¡¡¡p=i.a;
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡case jpc: /* Ìõ¼þÌø×ª */
¡¡¡¡¡¡¡¡¡¡¡¡t--;
¡¡¡¡¡¡¡¡¡¡¡¡if(s[t]==0)p=i.a;
¡¡¡¡¡¡¡¡¡¡¡¡break;
¡¡¡¡¡¡}
¡¡¡¡}
¡¡¡¡while(p!=0);
¡¡¡¡fclose(fa2);
¡¡}
|