I write a simple code for test.
After assembly:
funadd: addiu $sp,$sp,-24 sw $fp,20($sp) move $fp,$sp sw $4,24($fp) sw $5,28($fp) sw $0,8($fp) lw $3,24($fp) lw $2,28($fp) addu $2,$3,$2 sw $2,8($fp) lw $2,8($fp) move $sp,$fp lw $fp,20($sp) addiu $sp,$sp,24 jr $31 nopfun:... lw $2,%got(funadd)($28) move $25,$2 .reloc 1f,R_MIPS_JALR,funadd1: jalr $25 nop **lw $28,16($fp)** sw $2,28($fp) lw $3,28($fp) lw $2,24($fp) subu $2,$3,$2 sw $2,28($fp) lw $2,28($fp) move $sp,$fp lw $31,36($sp) lw $fp,32($sp) addiu $sp,$sp,40 jr $31 nopmain:... lw $2,%got(fun)($28) move $25,$2 .reloc 1f,R_MIPS_JALR,fun1: jalr $25 nop **lw $28,16($fp)** sw $2,32($fp) lw $5,32($fp) lw $2,%got($LC0)($28) addiu $4,$2,%lo($LC0) lw $2,%call16(printf)($28) move $25,$2 .reloc 1f,R_MIPS_JALR,printf1: jalr $25 nop **lw $28,16($fp)** lw $2,32($fp) move $sp,$fp lw $31,44($sp) lw $fp,40($sp) addiu $sp,$sp,48 jr $31 nop...
I realize after each function call, there is a code "lw $28,16($fp)".But I don't see any code related to $28 and 16($fp) in both calling and called function.
What does the code mean? When does 16($fp) be modified and what is the value in 16($fp)?