这是我的原始代码
main:
addi $sp, $sp, -8 # adjust stack for 2 items
sw $ra, 4($sp) # save return address
sw $a0, 0($sp) # save argument
slti $t0, $a0, 1 # test for n<1
beq $t0, $zero, L1
addi $v0, $zero, 1 # if so, result is 1
addi $sp, $sp, 8 # pop 2 items from stack
jr $ra # and return
L1: addi $a0, $a0, -1 # else decrement n
jal main # recursive call
lw $a0, 0($sp) # restore original n
lw $ra, 4($sp) # and return address
addi $sp, $sp, 8 # pop 2 items from stack
mul $v0, $a0, $v0 # multiply to get result
jr $ra # and return
我想要n!
的初始值为n=2, $sp <= 0x0000 A0000
答案 0 :(得分:1)
从{em> {1>}调用 ,而不是使main
本身递归。
或将main
的第一个参数用作int main(int argc, char **argv)
。
因此,您将使用n
运行程序以使用./fac $(seq 2 4)
运行程序。 What does int argc, char *argv[] mean?
Unix $a0 = 4
命令显示seq 2 4
,因此该命令具有3个参数以及隐式的第一个arg(命令名称),因此C启动代码会将2 3 4
传递给{{ 1}}作为4
参数。
使用main
是一种方便的技巧,可以搞乱手写的asm,避免编写整数解析代码,并使程序以寄存器(或某些其他平台上的内存)中的二进制整数开头,例如argc
,而不是x86-64 System V ABI中的./foo $(seq number)
。