Call functions
A call to a function (subroutine in assembly-speak) causes a transfer
of control to another part of program.  There are two instructions
to use: jal (jump and link) and ret (return).
jal
r1 ads          r1 is link
register
The effect is 
R[r1]
= PC; pc = ads
ret
r1
pc = R[r1]
The second important thing is how to pass parameters to subroutines.
1 through global variables
2 through registers
3 through stack
Stack data structure
A stack is a first in last out data structure.  It needs a stack
pointer to access the data element.  See the following picture of
stack.
Assume the operations are: push 1, push 2, push 3.
top
3
2
1
The operation: pop -> 3
top
2
1
The S2 instructions for stack operations are:
push
r1 r2
pop r1 r2
r1 is stack pointer
push
is R[r1]++; M[R[r1]] = R[r2]
pop  is R[r2] = M[R[r1]];
R[r1]--
The example how to call a subroutine.
main
  a = 2
  sq(a)
sq(x) 
  return x * x
There are two things to be concerned.
1 how to pass parameters via stack
2 how to return a value from sub, through a register
Register convention
r31  stack pointer
r30 display  trap 1 trap 2...
r29 link register
r28 return value
.symbol
  a 100
.code 0
:main
  mv r1 #2
  st a
r1     ;; a = 2
  ld r1 a
  push r31 r1 
  jal r29 sq  ;; call
sq(a)
  mv r30 r27 
  trap
1      ;; print return value
  trap 0
:sq
  pop r31 r1
  mul r27 r1 r1
  ret r29 
When there is a nested call to subroutines (or the recursive call), the
link register must be saved and restored.
sub
....
push sp link
call xyz
...
pop sp link
ret link
fac n
  if n == 0 ret 1
  else return n * fac n -1
A subroutine is an "abstraction" of a program. It is a power tool of
thought of programmers.  It is also called "factorization" in
Software engineering practice.  It promotes the "reuse" of code
among many programs.
End of lecture