summaryrefslogtreecommitdiff
path: root/data/examples/test12.asm
diff options
context:
space:
mode:
Diffstat (limited to 'data/examples/test12.asm')
-rw-r--r--data/examples/test12.asm213
1 files changed, 213 insertions, 0 deletions
diff --git a/data/examples/test12.asm b/data/examples/test12.asm
new file mode 100644
index 0000000..dbb716b
--- /dev/null
+++ b/data/examples/test12.asm
@@ -0,0 +1,213 @@
+# All program code is placed after the
+# .text assembler directive
+.text
+
+# Declare main as a global function
+.globl main
+
+j main
+
+# code for fib
+fib:
+# Entering a new scope.
+# Symbols in symbol table:
+# println
+# i
+# return
+# Update the stack pointer.
+addi $sp $sp -0
+# Get i's offset from $sp from the symbol table and initialize i's address with it. We'll add $sp later.
+li $t1 -4
+# Add the stack pointer address to the offset.
+add $t1 $t1 $sp
+# Load the value of i.
+lw $t0 0($t1)
+li $t1 0
+sub $t0 $t0 $t1
+bne $t0 $zero datalabel0
+li $t0 1
+sw $t0 -8($sp)
+jr $ra
+j datalabel1
+datalabel0:
+datalabel1:
+# Get i's offset from $sp from the symbol table and initialize i's address with it. We'll add $sp later.
+li $t1 -4
+# Add the stack pointer address to the offset.
+add $t1 $t1 $sp
+# Load the value of i.
+lw $t0 0($t1)
+li $t1 1
+sub $t0 $t0 $t1
+bne $t0 $zero datalabel2
+li $t0 1
+sw $t0 -8($sp)
+jr $ra
+j datalabel3
+datalabel2:
+datalabel3:
+# Calling function fib
+# Save $ra to a register
+move $t0 $ra
+# Save $t0-9 registers
+sw $t0 -12($sp)
+# Evaluate parameters and save to stack
+# Get i's offset from $sp from the symbol table and initialize i's address with it. We'll add $sp later.
+li $t2 -4
+# Add the stack pointer address to the offset.
+add $t2 $t2 $sp
+# Load the value of i.
+lw $t1 0($t2)
+li $t2 1
+sub $t1 $t1 $t2
+sw $t1 -16($sp)
+# Update the stack pointer
+add $sp $sp -12
+# Call the function
+jal fib
+# Restore the stack pointer
+add $sp $sp 12
+# Restore $t0-9 registers
+lw $t0 -12($sp)
+# Restore $ra
+move $ra $t0
+# Get return value off stack
+lw $t0 -20($sp)
+# Calling function fib
+# Save $ra to a register
+move $t1 $ra
+# Save $t0-9 registers
+sw $t0 -12($sp)
+sw $t1 -16($sp)
+# Evaluate parameters and save to stack
+# Get i's offset from $sp from the symbol table and initialize i's address with it. We'll add $sp later.
+li $t3 -4
+# Add the stack pointer address to the offset.
+add $t3 $t3 $sp
+# Load the value of i.
+lw $t2 0($t3)
+li $t3 2
+sub $t2 $t2 $t3
+sw $t2 -20($sp)
+# Update the stack pointer
+add $sp $sp -16
+# Call the function
+jal fib
+# Restore the stack pointer
+add $sp $sp 16
+# Restore $t0-9 registers
+lw $t0 -12($sp)
+lw $t1 -16($sp)
+# Restore $ra
+move $ra $t1
+# Get return value off stack
+lw $t1 -24($sp)
+add $t0 $t0 $t1
+sw $t0 -8($sp)
+jr $ra
+# Exiting scope.
+addi $sp $sp 0
+jr $ra
+
+# code for main
+main:
+# Entering a new scope.
+# Symbols in symbol table:
+# println
+# i
+# return
+# Update the stack pointer.
+addi $sp $sp -0
+# Get i's offset from $sp from the symbol table and initialize i's address with it. We'll add $sp later.
+li $t0 -4
+# Add the stack pointer address to the offset.
+add $t0 $t0 $sp
+# Compute rhs for assignment =
+li $t1 0
+# complete assignment statement with store
+sw $t1 0($t0)
+# println
+la $a0 datalabel4
+li $v0 4
+syscall
+la $a0 newline
+li $v0 4
+syscall
+datalabel5:
+# Get i's offset from $sp from the symbol table and initialize i's address with it. We'll add $sp later.
+li $t1 -4
+# Add the stack pointer address to the offset.
+add $t1 $t1 $sp
+# Load the value of i.
+lw $t0 0($t1)
+li $t1 12
+slt $t0 $t0 $t1
+subi $t0 $t0 1
+bne $t0 $zero datalabel6
+# Entering a new scope.
+# Symbols in symbol table:
+# println
+# Update the stack pointer.
+addi $sp $sp -4
+# println
+# Calling function fib
+# Save $ra to a register
+move $t0 $ra
+# Save $t0-9 registers
+sw $t0 -4($sp)
+# Evaluate parameters and save to stack
+# Get i's offset from $sp from the symbol table and initialize i's address with it. We'll add $sp later.
+li $t2 0
+# Add the stack pointer address to the offset.
+add $t2 $t2 $sp
+# Load the value of i.
+lw $t1 0($t2)
+sw $t1 -8($sp)
+# Update the stack pointer
+add $sp $sp -4
+# Call the function
+jal fib
+# Restore the stack pointer
+add $sp $sp 4
+# Restore $t0-9 registers
+lw $t0 -4($sp)
+# Restore $ra
+move $ra $t0
+# Get return value off stack
+lw $t0 -12($sp)
+move $a0 $t0
+li $v0 1
+syscall
+la $a0 newline
+li $v0 4
+syscall
+# Get i's offset from $sp from the symbol table and initialize i's address with it. We'll add $sp later.
+li $t0 0
+# Add the stack pointer address to the offset.
+add $t0 $t0 $sp
+# Compute rhs for assignment =
+# Get i's offset from $sp from the symbol table and initialize i's address with it. We'll add $sp later.
+li $t2 0
+# Add the stack pointer address to the offset.
+add $t2 $t2 $sp
+# Load the value of i.
+lw $t1 0($t2)
+li $t2 1
+add $t1 $t1 $t2
+# complete assignment statement with store
+sw $t1 0($t0)
+# Exiting scope.
+addi $sp $sp 4
+j datalabel5
+datalabel6:
+# Exiting scope.
+addi $sp $sp 0
+li $v0 10
+syscall
+
+# All memory structures are placed after the
+# .data assembler directive
+.data
+
+newline: .asciiz "\n"
+datalabel4: .asciiz "This program prints the first 12 numbers of the Fibonacci sequence."