#define STACKSIZE 1000 int stack[STACKSIZE]; int R0, R1, R2, R3, R4, R5, R6, R7; int SP=0, BP=0; void push(int element) { stack[++SP]=element; return; } int pop() { return(stack[SP--]); } int getint() { int a; scanf("%d",&a); return a; } void putint(int a) { printf("%d",a); } /* End of machine description */ void add() { push(BP); /* Dynamic link */ BP=SP; /* set base(BP) to new activation record */ SP=SP+1; /* make space for local variables*/ push(R0); /* save registers */ push(R1); push(R2); push(R3); push(R4); push(R5); push(R6); push(R7); R0=stack[BP-1]+stack[BP-2]; stack[BP+1]=R0; /*for local variable c*/ stack[BP-3]=stack[BP+1]; /*assign return value */ R7=pop(); R6=pop(); R5=pop(); R4=pop(); R3=pop(); R2=pop(); R1=pop(); R0=pop(); SP=SP-1; /*restore SP*/ BP=pop(); return; } void my_main() { push(BP); /* Dynamic link */ BP = SP; /* set base of current activation record */ SP = SP + 3; /* make space for local variables*/ push(R0); /* save registers */ push(R1); push(R2); push(R3); push(R4); push(R5); push(R6); push(R7); /* assign local variables */ stack[BP+1] = 9; /* x_7 */ stack[BP+2] = 7; /* y_8 */ /*stack[BP+3] = z-value */ /* z_9 */ SP=SP+1; /*make space for return value*/ /* t2 */ push(stack[BP+2]); /*push actual parameter*/ push(stack[BP+1]); add(); pop(); /*pop actual parameter*/ pop(); stack[BP+3] = stack[SP]; /* access return value */ /* t2 */ SP=SP-1; putint(stack[BP+3]); R7=pop(); R6=pop(); R5=pop(); R4=pop(); R3=pop(); R2=pop(); R1=pop(); R0=pop(); SP=SP-3; /*restore SP*/ BP = pop(); /* restore base pointer */ return; } /* The driver main() { my_main(); } */