You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
1.9 KiB
84 lines
1.9 KiB
# Simple routine to demo functions |
|
# USING a stack in this example to preserve |
|
# values of calling function |
|
|
|
# ------------------------------------------------------------------ |
|
|
|
.text |
|
|
|
.globl main |
|
main: |
|
# Register assignments |
|
# $s0 = x |
|
# $s1 = y |
|
|
|
# Initialize registers |
|
lw $s0, x # Reg $s0 = x |
|
lw $s1, y # Reg $s1 = y |
|
|
|
# Call function |
|
move $a0, $s0 # Argument 1: x ($s0) |
|
jal fun # Save current PC in $ra, and jump to fun |
|
move $s1,$v0 # Return value saved in $v0. This is y ($s1) |
|
|
|
# Print msg1 |
|
li $v0, 4 # print_string syscall code = 4 |
|
la $a0, msg1 |
|
syscall |
|
|
|
# Print result (y) |
|
li $v0,1 # print_int syscall code = 1 |
|
move $a0, $s1 # Load integer to print in $a0 |
|
syscall |
|
|
|
# Print newline |
|
li $v0,4 # print_string syscall code = 4 |
|
la $a0, lf |
|
syscall |
|
|
|
# Exit |
|
li $v0,10 # exit |
|
syscall |
|
|
|
# ------------------------------------------------------------------ |
|
|
|
# FUNCTION: int fun(int a) |
|
# Arguments are stored in $a0 |
|
# Return value is stored in $v0 |
|
# Return address is stored in $ra (put there by jal instruction) |
|
# Typical function operation is: |
|
|
|
fun: # This function overwrites $s0 and $s1 |
|
# We should save those on the stack |
|
# This is PUSH'ing onto the stack |
|
addi $sp,$sp,-4 # Adjust stack pointer |
|
sw $s0,0($sp) # Save $s0 |
|
addi $sp,$sp,-4 # Adjust stack pointer |
|
sw $s1,0($sp) # Save $s1 |
|
|
|
# Do the function math |
|
li $s0, 3 |
|
mul $s1,$s0,$a0 # s1 = 3*$a0 (i.e. 3*a) |
|
addi $s1,$s1,5 # 3*a+5 |
|
|
|
# Save the return value in $v0 |
|
move $v0,$s1 |
|
|
|
# Restore saved register values from stack in opposite order |
|
# This is POP'ing from the stack |
|
lw $s1,0($sp) # Restore $s1 |
|
addi $sp,$sp,4 # Adjust stack pointer |
|
lw $s0,0($sp) # Restore $s0 |
|
addi $sp,$sp,4 # Adjust stack pointer |
|
|
|
# Return from function |
|
jr $ra # Jump to addr stored in $ra |
|
|
|
# ------------------------------------------------------------------ |
|
|
|
# Start .data segment (data!) |
|
.data |
|
x: .word 5 |
|
y: .word 0 |
|
msg1: .asciiz "y=" |
|
lf: .asciiz "\n"
|
|
|