Running on SDSU/Rohan The input code: package testloop is body fib : integer; oldfib : integer; tmpfib, i : integer; begin fib := 1; oldfib := 1; writeln("This program also calculates the first 7 fibonacci numbers."); writeln(""); writeln("fibonacci(1) = 1"); writeln("fibonacci(2) = 1"); i := 2; loop exit when i = 7; i := i + 1; tmpfib := fib; fib := fib + oldfib; oldfib := tmpfib; writeln("fibonacci(", i, ") = ", fib); end loop; end; -------------------------------------- Running SIMPLE with command line -s (SymbolTable dump) -v (var addrs) in simple.c Symbol table dump: fib type: integer init: 1 used: 1 i type: integer init: 1 used: 1 oldfib type: integer init: 1 used: 1 tmpfib type: integer init: 1 used: 1 From codegen.c - DisplayRegs() marks used registers Register: 0 1 2 3 4 5 6 7 8 9 - - - - - - - - - - Used = x: Variable dump from GenStorage ID: fib Offset: 0 Proc. Level: 0 ID: i Offset: 4 Proc. Level: 0 ID: oldfib Offset: 8 Proc. Level: 0 ID: tmpfib Offset: 12 Proc. Level: 0 COMPILATION COMPLETE out simple.c ------------------------------------- The listing file produced by simple package testloop is body fib : integer; oldfib : integer; tmpfib, i : integer; begin fib := 1; oldfib := 1; writeln("This program also calculates the first 7 fibonacci numbers."); writeln(""); writeln("fibonacci(1) = 1"); writeln("fibonacci(2) = 1"); i := 2; loop exit when i = 7; i := i + 1; tmpfib := fib; fib := fib + oldfib; oldfib := tmpfib; writeln("fibonacci(", i, ") = ", fib); end loop; end; ------------------------------------- The assembler file produced by simple # Register Usage: # $s0 for global variables # .text .globl main main: la $s0, GVARS # # Start Code # # Generate Assignment Statement li $t0,1 sw $t0,0($s0) # # Generate Assignment Statement li $t0,1 sw $t0,8($s0) # # Generate Writeln statement la $a0, S6 li $v0, 4 syscall la $a0, S0 li $v0, 4 syscall # # Generate Writeln statement la $a0, S5 li $v0, 4 syscall la $a0, S0 li $v0, 4 syscall # # Generate Writeln statement la $a0, S4 li $v0, 4 syscall la $a0, S0 li $v0, 4 syscall # # Generate Writeln statement la $a0, S3 li $v0, 4 syscall la $a0, S0 li $v0, 4 syscall # # Generate Assignment Statement li $t0,2 sw $t0,4($s0) # # Generate Loop statement for LOOP_0: # # Generate Exit statement for lw $t0,4($s0) seq $t0,$t0,7 bne $t0, 0,LOOP_1 # # Generate Assignment Statement lw $t0,4($s0) add $t0,$t0,1 sw $t0,4($s0) # # Generate Assignment Statement lw $t0,0($s0) sw $t0,12($s0) # # Generate Assignment Statement lw $t0,0($s0) lw $t1,8($s0) add $t0,$t0,$t1 sw $t0,0($s0) # # Generate Assignment Statement lw $t0,12($s0) sw $t0,8($s0) # # Generate Writeln statement la $a0, S2 li $v0, 4 syscall li $v0, 1 lw $a0,4($s0) syscall la $a0, S1 li $v0, 4 syscall li $v0, 1 lw $a0,0($s0) syscall la $a0, S0 li $v0, 4 syscall j LOOP_0 LOOP_1: # # End Loop # # Halt execution li $v0 10 syscall # # Finish up by writing out constants .word 0 CONST: #Constant storage area .data S0: .asciiz "\n" .data S1: .asciiz ") = " .data S2: .asciiz "fibonacci(" .data S3: .asciiz "fibonacci(2) = 1" .data S4: .asciiz "fibonacci(1) = 1" .data S5: .asciiz "" .data S6: .asciiz "This program also calculates the first 7 fibonacci numbers." # # Reserve space for global variables .word 0 GVARS: # space for Global Variables .data _fib: .word 0 # Offset at 0 .data _i: .word 0 # Offset at 4 .data _oldfib: .word 0 # Offset at 8 .data _tmpfib: .word 0 # Offset at 12 .data Temp_Wr: .word 0 #just for alignment of write(exprtree) ------------------------------------- execute the code in spim: SPIM Version 6.2 of January 11, 1999 Copyright 1990-1998 by James R. Larus (larus@cs.wisc.edu). All Rights Reserved. See the file README for a full copyright notice. Loaded: /opt/spim/bin/trap.handler This program also calculates the first 7 fibonacci numbers. fibonacci(1) = 1 fibonacci(2) = 1 fibonacci(3) = 2 fibonacci(4) = 3 fibonacci(5) = 5 fibonacci(6) = 8 fibonacci(7) = 13