// for passing an argument and receiving a return value uint64_t arg; void factorial() { uint64_t n; if (arg == 0) { arg = 1; } else { n = arg; arg = n-1; factorial(); arg = arg * n; } } void getui() { // implementation of subprogram getui } void puts() { // implementation of subprogram puts } void putui() { // implementation of subprogram putui } // some strings char msg0[] = "n = "; char msg1[] = "! = "; void main() { // local variable uint64_t n; // copy pointer to string literal to arg, call puts arg = msg0; puts(); // call subprogram getui, copy return value to local variable getui(); n = arg; // copy local variable to arg, call putui arg = n; // could be "optimized away" putui(); // copy pointer to string literal to arg, call puts arg = msg1; puts(); // copy local n to global arg, call subprogram factorial arg = n; factorial(); // copy local variable to arg, call putui //arg = n; putui(); // for convenience putchar('\n'); }