MIPS return address in main
- by Alexander
I am confused why in the code below I need to decrement the stack pointer and store the return address again. If I don't do that... then PCSpim keeps on looping.. Why is that?
########################################################################################################################
### main
########################################################################################################################
.text
.globl main
main: addi $sp, $sp, -4 # Make space on stack
sw $ra, 0($sp) # Save return address
# Start test 1
############################################################
la $a0, asize1 # 1st parameter: address of asize1[0]
la $a1, frame1 # 2nd parameter: address of frame1[0]
la $a2, window1 # 3rd parameter: address of window1[0]
jal vbsme # call function
# Printing $v0
add $a0, $v0, $zero # Load $v0 for printing
li $v0, 1 # Load the system call numbers
syscall
# Print newline.
la $a0, newline # Load value for printing
li $v0, 4 # Load the system call numbers
syscall
# Printing $v1
add $a0, $v1, $zero # Load $v1 for printing
li $v0, 1 # Load the system call numbers
syscall
# Print newline.
la $a0, newline # Load value for printing
li $v0, 4 # Load the system call numbers
syscall
# Print newline.
la $a0, newline # Load value for printing
li $v0, 4 # Load the system call numbers
syscall
############################################################
# End of test 1
lw $ra, 0($sp) # Restore return address
addi $sp, $sp, 4 # Restore stack pointer
jr $ra # Return
########################################################################################################################
### vbsme
########################################################################################################################
#.text
.globl vbsme
vbsme: addi $sp, $sp, -4 # create space on the stack pointer
sw $ra, 0($sp) # save return address
exit: add $v1, $t5, $zero # (v1) x coordinate of the block in the frame with the minimum SAD
add $v0, $t4, $zero # (v0) y coordinate of the block in the frame with the minimum SAD
lw $ra, 0($sp) # restore return address
addi $sp, $sp, 4 # restore stack pointer
jr $ra # return
If I delete:
addi $sp, $sp, -4 # create space on the stack pointer
sw $ra, 0($sp) # save return address
and
lw $ra, 0($sp) # restore return address
addi $sp, $sp, 4 # restore stack pointer
on vbsme: PCSpim keeps on running... Why??? I shouldn't have to increment/decrement the stack pointer on vbsme and then do the jr again right? The jal in main is supposed to handle that