Professional Documents
Culture Documents
.text
.globl fred
fred:
# prologue
addi $sp, $sp, -16
sw $ra, 12($sp) # save $ra for return to caller
sw $s2, 8($sp) # save $s2 for some other procedure
sw $s1, 4($sp) # save $s1 for some other procedure
sw $s0, 0($sp) # save $s0 for some other procedure
add $s0, $a0, $zero # copy j from $a0 to $s0
add $s1, $a1, $zero # copy k from $a1 to $s1
# body
addi $a0, $s1, 10 # $a0 = k + 10
jal bob
add $s2, $v0, $zero # x = r.v. from bob
sub $t0, $s1, $s0 # $t0 = k - j
sub $v0, $t0, $s2 # r.v. = k - j - x
# epilogue
lw $s0, 0($sp) # recover old value of $s0
lw $s1, 4($sp) # recover old value of $s1
lw $s2, 8($sp) # recover old value of $s2
lw $ra, 12($sp) # copy backed-up $ra for correct return
addi $sp, $sp, 16
jr $ra
Note: Copying incoming arguments to s-registers is one one of two effective methods for resolving the con-
flict between incoming and outgoing arguments. The other method involves copying incoming arguments
to stack slots; this method is shown on the next page.
ENCM 369 Winter 2017: The Stack Handout page 3 of 4
.text
.globl fred
fred:
# prologue
addi $sp, $sp, -16
sw $a1, 12($sp) # copy k to stack slot at 12($sp)
sw $a0, 8($sp) # copy j to stack slot at 8($sp)
sw $ra, 4($sp) # save $ra for return to caller
sw $s0, 0($sp) # save $s0 for some other procedure
# body
# Before calling bob, we can safely get k from $a1. But after
# calling bob, we must get j and k from stack slots.
addi $a0, $a1, 10 # $a0 = k + 10
jal bob
add $s0, $v0, $zero # x = r.v. from bob
lw $t0, 12($sp) # $t0 = k
lw $t1, 8($sp) # $t1 = j
sub $t2, $t0, $t1 # $t2 = k - j
sub $v0, $t2, $s0 # r.v. = k - j - x
# epilogue
lw $s0, 0($sp)
lw $ra, 4($sp)
addi $sp, $sp, 16
jr $ra
ENCM 369 Winter 2017: The Stack Handout page 4 of 4