Я написал компилятор, который делает это для удовольствия, с подмножеством синтаксиса asm для C в SPIM (конечно, рекурсия поддерживается) ..
Согласно этому
int f(int x)
{
if (x == 1)
return 1;
else
return (x*f(x-1));
}
int main (void) {
f(8);
}
компилируется в
.data
.align 4
.align 1
.text
.globl main
main:
subu $sp, $sp, 32
sw $ra, 20($sp)
sw $fp, 16($sp)
addiu $fp, $sp, 28
li $t6, 8
move $a0, $t6
jal f
lw $ra, 20($sp)
lw $fp, 16($sp)
addu $sp, $sp, 32
jr $ra
f:
subu $sp, $sp, 36
sw $ra, 24($sp)
sw $fp, 20($sp)
addiu $fp, $sp, 32
li $t0, 1
bne $a0, $t0, equal0
li $t1, 1
b equal1
equal0:
li $t1, 0
equal1:
li $t2, 0
beq $t1, $t2, if2
li $v0, 1
lw $ra, 24($sp)
lw $fp, 20($sp)
addu $sp, $sp, 36
jr $ra
b if3
if2:
li $t3, 1
subu $t4, $a0, $t3
sw $a0, 0($sp)
move $a0, $t4
jal f
move $t5, $v0
lw $a0, 0($sp)
mulou $v0, $a0, $t5
lw $ra, 24($sp)
lw $fp, 20($sp)
addu $sp, $sp, 36
jr $ra
if3:
lw $ra, 24($sp)
lw $fp, 20($sp)
addu $sp, $sp, 36
jr $ra
Попробуйте, если он работает, он вообще не оптимизирован, но вы можете получить подсказку и изменить его в соответствии с вашими потребностями.