C <del>924</del> <del>882</del> <del>622</del> <del>603</del> 587 chars = With obvious newlines removed (retained for readability). #define A sbrk(8);signal(11,S); #define U *t++ #define P (t>s?*--t:0) #define W(x)write(1,x,1); #define B(x,y)break;case 48+x:b=48+x;w=P;y;U=w; *s,*t,w,a,c,d;char b;S(x){A} p(x){if(x<0){W("-")x=-x;}if(x>9)p(x/10);b=48+x%10;W(&b)} main(){t=s=A U=0;while(read(0,&b,1))switch(b){ B(0,w+=P*pow(10,w?ceil(log10(w)):1)) B(1,++w) B(2,--w) B(3,w*=P) B(4,w=P/w) B(5,w+=P) B(6,w=P-w) B(7,w=pow(P,w)) B(8,w=P%w) B(9,*t=w;w=*s;memmove(s,s+1,t-s<<2)) B(17,memmove(s+1,s,t++-s<<2);*s=w;w=P) B(18,U=w) B(19,a=P;U=a;U=w;U=a) B(20,a=P;U=w;w=a) B(21,a=P;c=P;d=P;U=a;U=w;U=c;w=d) B(22,w=P)} for(W("[")t>s;)p(P),W(" ") W("]") } This implements the "underflow pushes zero" interpretation from Jan Dvorak's comment. Ungolfed: #include<math.h> #include<signal.h> void S(int x){signal(SIGSEGV,S);sbrk(8*8*8);} int*s,*t,*i,w,a,c,d; //stack top index working accumulator count data u(x){*t++=x;} //push() o(){return t>s?*--t:0;} //pop() p(x){ //print() if(x<0){ //negative? W(*"-") //output '-' x=-x; //negate } if(x>9) //more than one digit? p(x/10); //recurse after integer-divide b=48+x%10; //isolate and convert single digit to ascii W(b) //output ascii digit } main(){ char b[1]; signal(SIGSEGV,S); //auto-allocate memory for stack t=s=sbrk(8*8*8); //get start of memory and allocate while(read(0,b,1)){ write(1,b,1); //for debugging: echo the command being executed switch(*b){ case '0': w=o(); a=o(); for(c=ceil(log10(w));c>0;c--) a*=10; u(a+w); break; case '1': u(o()+1); break; case '2': u(o()-1); break; case '3': w=o(); u(o()*w); break; case '4': w=o(); u(o()/w); break; case '5': u(o()+o()); break; case '6': w=o(); u(o()-w); break; case '7': c=o();a=1; for(w=o();c>0;c--) a*=w; u(a); break; case '8': w=o(); u(o()%w); break; case '9': w=*s; memmove(s,s+1,4*(t-s-1)); t[-1]=w; break; case 'A': w=t[-1]; memmove(s+1,s,4*(t-s-1)); *s=w; break; case 'B': w=o(); u(w); u(w); break; case 'C': w=o(); a=o(); u(a); u(w); u(a); u(w); break; case 'D': w=o(); a=o(); u(w); u(a); break; case 'E': w=o(); a=o(); c=o(); d=o(); u(a); u(w); u(d); u(c); break; case 'F': o(); break; } } write(1,"\n[",2); //dump the stack i=t; do { p(*--i); } while(i>s && write(1,",",1)); write(1,"]\n",2); }