#include #include #include #define read(x) scanf("%d",&x) #define write(x) printf("%d\n",x) int const N=2000; #define top mem[0] #define base mem[1] #define jumpReg mem[2] #define membase 3 int mem[N]; int main() { // the only function we will use // prologue before calling main top = membase; mem[top] = 0; // exit address base = top + 1; // base of main top = base + 3; // top of main mainFunc: read(mem[base+0]); read(mem[base+1]); // prelogue to foo mem[top+0] = mem[base+0]; // parameter 1 mem[top+1] = mem[base+1]; // parameter 2 mem[top+2] = base; mem[top+3] = top; // top + 4 is the place for return value mem[top+5] = 1; // label_1 base = top + 6; // base for addFunc top = base + 3; // top for addFunc goto addFunc; label_1:; mem[base+2] = mem[top+4]; // copy the return value write(mem[base+2]); // epilogue of main jumpReg = mem[base-1]; // Goto(mem[base-1]) goto jumpTable; addFunc: ; mem[base+0] = mem[base-4-2]; // copy the parameters mem[base+1] = mem[base-4-1]; mem[base+2] = mem[base+0] + mem[base+1]; // epilogue of foo top = mem[base-3]; mem[base-2] = mem[base+2]; // return value jumpReg = mem[base-1]; base = mem[base-4]; goto jumpTable; // Jump table jumpTable: switch(jumpReg) { case 0: exit(0); case 1: goto label_1; default: assert(0); } }