program Greatest Common Divisor
// Input:    a, b
// Output:   gcd(a, b)
// Remarks:  Uses Euclid's inefficient subtraction algorithm does not handle
//           negative integers
// -----------------------------------------------------------------------------
10: 8AFF   read R[A]                     a
11: 8BFF   read R[B]                     b
12: FF30   R[F] <- pc; goto 30           
13: 9CFF   write R[C]                    gcd(a, b)
14: 0000   halt                          

function gcd
// Input:                R[A] and R[B] (should be passed by value)
// Return address:       R[F]
// Output:               R[C] = gcd(R[A], R[B])
// Temporary variables:  R[D]

30: CB38   if (R[B] == 0) goto 38        while (b != 0) {
31: 2DAB   R[D] <- R[A] - R[B]              if (b >= a) {
32: DD36   if (R[D] > 0) goto 36               // swap and b
33: 1DA0   R[D] <- R[A]                        temp = a;
34: 1AB0   R[A] <- R[B]                        a = b;
35: 1BD0   R[B] <- R[D]                        b = temp;
//                                          }
36: 2AAB   R[A] <- R[A] - R[B]              a -= b;
37: C030   goto 30                       }

38: 1CA0   R[C] <- R[A]                  c = a;
39: EF00   goto R[F]                     return c;