summaryrefslogtreecommitdiff
path: root/data/examples/test14.asm
diff options
context:
space:
mode:
Diffstat (limited to 'data/examples/test14.asm')
-rw-r--r--data/examples/test14.asm289
1 files changed, 289 insertions, 0 deletions
diff --git a/data/examples/test14.asm b/data/examples/test14.asm
new file mode 100644
index 0000000..4c16021
--- /dev/null
+++ b/data/examples/test14.asm
@@ -0,0 +1,289 @@
+# All program code is placed after the
+# .text assembler directive
+.text
+
+# Declare main as a global function
+.globl main
+
+j main
+
+# code for sum
+sum:
+# Entering a new scope.
+# Symbols in symbol table:
+# println
+# x
+# i
+# sum
+# n
+# 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 -16
+# 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)
+# Get sum's offset from $sp from the symbol table and initialize sum's address with it. We'll add $sp later.
+li $t0 -20
+# 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)
+datalabel0:
+# Get i's offset from $sp from the symbol table and initialize i's address with it. We'll add $sp later.
+li $t1 -16
+# Add the stack pointer address to the offset.
+add $t1 $t1 $sp
+# Load the value of i.
+lw $t0 0($t1)
+# Get n's offset from $sp from the symbol table and initialize n's address with it. We'll add $sp later.
+li $t2 -8
+# Add the stack pointer address to the offset.
+add $t2 $t2 $sp
+# Load the value of n.
+lw $t1 0($t2)
+slt $t0 $t0 $t1
+subi $t0 $t0 1
+bne $t0 $zero datalabel1
+# Entering a new scope.
+# Symbols in symbol table:
+# println
+# Update the stack pointer.
+addi $sp $sp -20
+# Get sum's offset from $sp from the symbol table and initialize sum'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 sum's offset from $sp from the symbol table and initialize sum'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 sum.
+lw $t1 0($t2)
+# Get x's offset from $sp from the symbol table and initialize x's address with it. We'll add $sp later.
+li $t3 16
+# Add the stack pointer address to the offset.
+add $t3 $t3 $sp
+# Get x's base address from the stack.
+lw $t3 0($t3)
+# Evaluate the index expression and store in a register.
+# Get i's offset from $sp from the symbol table and initialize i's address with it. We'll add $sp later.
+li $t5 4
+# Add the stack pointer address to the offset.
+add $t5 $t5 $sp
+# Load the value of i.
+lw $t4 0($t5)
+# Multiply the index by -4.
+li $t5 4
+mul $t4 $t4 $t5
+# Add the index offset to the offset.
+add $t3 $t3 $t4
+# Load the value of x.
+lw $t2 0($t3)
+add $t1 $t1 $t2
+# complete assignment statement with store
+sw $t1 0($t0)
+# 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 =
+# 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
+add $t1 $t1 $t2
+# complete assignment statement with store
+sw $t1 0($t0)
+# Exiting scope.
+addi $sp $sp 20
+j datalabel0
+datalabel1:
+# Get sum's offset from $sp from the symbol table and initialize sum's address with it. We'll add $sp later.
+li $t1 -20
+# Add the stack pointer address to the offset.
+add $t1 $t1 $sp
+# Load the value of sum.
+lw $t0 0($t1)
+sw $t0 -12($sp)
+jr $ra
+# Exiting scope.
+addi $sp $sp 0
+jr $ra
+
+# code for main
+main:
+# Entering a new scope.
+# Symbols in symbol table:
+# a
+# println
+# i
+# return
+# Update the stack pointer.
+addi $sp $sp -0
+# println
+la $a0 datalabel2
+li $v0 4
+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 -44
+# 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)
+datalabel3:
+# Get i's offset from $sp from the symbol table and initialize i's address with it. We'll add $sp later.
+li $t1 -44
+# Add the stack pointer address to the offset.
+add $t1 $t1 $sp
+# Load the value of i.
+lw $t0 0($t1)
+li $t1 10
+slt $t0 $t0 $t1
+subi $t0 $t0 1
+bne $t0 $zero datalabel4
+# Entering a new scope.
+# Symbols in symbol table:
+# println
+# Update the stack pointer.
+addi $sp $sp -44
+# Get a's offset from $sp from the symbol table and initialize a's address with it. We'll add $sp later.
+li $t0 4
+# Add the stack pointer address to the offset.
+add $t0 $t0 $sp
+# Evaluate the index expression and store in a register.
+# 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)
+# Multiply the index by -4.
+li $t2 4
+mul $t1 $t1 $t2
+# Add the index offset to the offset.
+add $t0 $t0 $t1
+# 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)
+# complete assignment statement with store
+sw $t1 0($t0)
+# 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 44
+j datalabel3
+datalabel4:
+# println
+# Calling function sum
+# Save $ra to a register
+move $t0 $ra
+# Save $t0-9 registers
+sw $t0 -48($sp)
+# Evaluate parameters and save to stack
+# Get a's offset from $sp from the symbol table and initialize a's address with it. We'll add $sp later.
+li $t2 -40
+# Add the stack pointer address to the offset.
+add $t2 $t2 $sp
+# Put the address of the array into the register.
+# Use the address of a.
+move $t1 $t2
+sw $t1 -52($sp)
+li $t1 4
+sw $t1 -56($sp)
+# Update the stack pointer
+add $sp $sp -48
+# Call the function
+jal sum
+# Restore the stack pointer
+add $sp $sp 48
+# Restore $t0-9 registers
+lw $t0 -48($sp)
+# Restore $ra
+move $ra $t0
+# Get return value off stack
+lw $t0 -60($sp)
+move $a0 $t0
+li $v0 1
+syscall
+la $a0 newline
+li $v0 4
+syscall
+# println
+# Calling function sum
+# Save $ra to a register
+move $t0 $ra
+# Save $t0-9 registers
+sw $t0 -48($sp)
+# Evaluate parameters and save to stack
+# Get a's offset from $sp from the symbol table and initialize a's address with it. We'll add $sp later.
+li $t2 -40
+# Add the stack pointer address to the offset.
+add $t2 $t2 $sp
+# Put the address of the array into the register.
+# Use the address of a.
+move $t1 $t2
+sw $t1 -52($sp)
+li $t1 8
+sw $t1 -56($sp)
+# Update the stack pointer
+add $sp $sp -48
+# Call the function
+jal sum
+# Restore the stack pointer
+add $sp $sp 48
+# Restore $t0-9 registers
+lw $t0 -48($sp)
+# Restore $ra
+move $ra $t0
+# Get return value off stack
+lw $t0 -60($sp)
+move $a0 $t0
+li $v0 1
+syscall
+la $a0 newline
+li $v0 4
+syscall
+# Exiting scope.
+addi $sp $sp 0
+li $v0 10
+syscall
+
+# All memory structures are placed after the
+# .data assembler directive
+.data
+
+newline: .asciiz "\n"
+datalabel2: .asciiz "This should print 6 and 28"