如何使用我的工厂分解代码设置初始值?

时间:2018-09-24 09:25:40

标签: assembly mips factorial mars-simulator

这是我的原始代码

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

1 个答案:

答案 0 :(得分:1)

从{em> {}调用 ,而不是使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)