// just needed so you actually can compile this with gcc typedef unsigned long uint64_t; // for passing an argument and receiving a return value uint64_t arg; void factorial() { uint64_t n; n = arg; arg = n-1; if (arg == 0) { arg = 1; } else { factorial(); arg = arg * n; } } void getui() { // implementation of subprogram getui scanf("%lu", &arg); } void puts() { // implementation of subprogram puts printf("%s", arg); } void putui() { // implementation of subprogram putui printf("%lu", arg); } // some string literals 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'); }