Chapter 5, Computing with Register Machines

Exercise 5.3


Data flow diagrams

In the second diagram, I have used several registers to store intermediate results. Even one register can suffice instead of multiple such registers because each such register is used one at a time. However, it was causing some clutter in the diagrams. So I used multiple temporary registers for demonstration.


Controller Definition

Assuming good? and improve are primitive operations.

1
2
3
4
5
6
7
8
(controller
 (assign guess (const 1))
 loop
   (test (op good?) (reg guess) (reg x))
   (branch (label done))
   (assign (op improve) (reg guess) (reg x))
   (goto (label loop))
 done)

Expanded versions of improve and good?:

1
2
3
4
5
6
7
8
9
10
11
12
13
(controller
 (assign guess (const 1))
 loop
   (assign g2 (op *) (reg guess) (reg guess))
   (assign diff (op -) (reg g2) (reg x))
   (assign error (op abs) (reg diff))
   (test (op <) (reg error) (const 0.001))
   (branch (label done))
   (assign q (op /) (reg x) (reg guess))
   (assign sum (op +) (reg q) (reg guess))
   (assign guess (op /) (reg sum) (const 2))
   (goto (label loop))
   done)

Notice that all the temporary registers g2, diff, error, q, sum can be replaced with a single temp register t:

1
2
3
4
5
6
7
8
9
10
11
12
13
(controller
 (assign guess (const 1))
 loop
   (assign t (op *) (reg guess) (reg guess))
   (assign t (op -) (reg t) (reg x))
   (assign t (op abs) (reg t))
   (test (op <) (reg t) (const 0.001))
   (branch (label done))
   (assign t (op /) (reg x) (reg guess))
   (assign t (op +) (reg t) (reg guess))
   (assign guess (op /) (reg t) (const 2))
   (goto (label loop))
   done)