# int fact( int n )
# {
# if ( n<=1)
# return 1;
# else
# return n*fact(n-1);
# }
.text
.globl fact
fact:
# prolog
sub $sp,$sp,4 # 1. Push return address
sw $ra,($sp)
sub $sp,$sp,4 # 2. Push caller's frame pointer
sw $fp,($sp)
sub $sp,$sp,4 # 3. Push register $s1
sw $s1,($sp)
sub $fp,$sp,0 # 4. $fp = $sp - space_for_variables (==0)
move $sp,$fp # 5. $sp = $fp
# body of subroutine
. . . . . .
epilog: # epilog
# 1. Return value is already in $v0
add $sp,$fp,0 # 2. $sp = $fp + space_for_variables (==0)
lw $s1,($sp) # 3. Pop register $s1
add $sp,$sp,4 #
lw $fp,($sp) # 4. Pop $fp
add $sp,$sp,4 #
lw $ra,($sp) # 5. Pop $ra
add $sp,$sp,4 #
jr $ra # 6. return to caller
Simbol fact adalah simbol global (juga disebut simbol eksternal) sehingga assembler, linker dan loader bisa menggunakan simbol tersebut untuk menunjuk tempat yang sama di main memory.
Sebuah lokasi samacam fact ini yang mejadi target sebuah pemanggilan subroutine, disebut entry point. Kadang kala sebuah subroutine mempunyai beberap entri point, tiap-tiapnya berkaitan dengan fungsi yang berbeda-beda.
Quest 24: Apakah simbol global selalu meunjuk ke sebuah entry point?
Jawab: Tidak, bisa juga simbol global menunjuk ke suatu data yang diperlukan untuk operasi.
