Почему указатель стека и указатель фрейма имеют один и тот же адрес?
У меня сложилось впечатление, что указатель фрейма $fp установлен на первое слово стека в соответствии с компьютерной организацией и дизайном MIPS, 5-е изд., стр. 103.
int func(int g) {
int f = 9;
return g+f;
}
mips gcc 12.2.0 сгенерировал ассемблерный код.
func:
addiu $sp,$sp,-24
sw $fp,20($sp)
move $fp,$sp
sw $4,24($fp)
li $2,9 # 0x9
sw $2,8($fp)
lw $3,24($fp)
lw $2,8($fp)
nop
addu $2,$3,$2
move $sp,$fp
lw $fp,20($sp)
addiu $sp,$sp,24
jr $31
nop
Действительно ли $fp (указатель кадра) и $sp (указатель стека) содержат один и тот же адрес? Я бы подумал, что $fp будет указывать на первое слово в стеке, т.е.
func:
addiu $sp,$sp,-24
sw $fp,20($sp)
addiu $fp,$sp,20 #let $fp point to the first word on the stack
Существуют ли какие-либо правила, на которые должна указывать часть стека $fp, или все зависит от разрешения разработчика/компилятора программного обеспечения?