呼叫堆疊最經常被用於存放子程式的返回位址。在呼叫任何子程式時,主程式都必須暫存子程式執行完畢後應該返回到的位址。因此,如果被呼叫的子程式還要呼叫其他的子程式,其自身的返回位址就必須存入呼叫堆疊,在其自身執行完畢後再行取回。在遞迴程式中,每一層次遞迴都必須在呼叫堆疊上增加一條位址,因此如果程式出現無限遞迴(或僅僅是過多的遞迴層次),呼叫堆疊就會產生堆疊溢位。
main:
li $a0, 3
li $a1, 4
jal sumsq
move $s0, $v0
j mainend
sumsq:
addi $sp, $sp, -4 # 在堆疊上分配空間
sw $ra, 0($sp) # 將sumsq的返回位址存入堆疊中
jal square
move $t0, $v0
move $a0, $a1
jal square
add $v0, $v0, $t0
lw $ra, 0($sp) # 從堆疊中取回sumsq的返回位址
addi $sp, $sp, 4 # 釋出堆疊上分配的空間
jr $ra
square:
mult $a0, $a0
mflo $v0
jr $ra
mainend: