Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有人能和我一起看一下这个MIPS代码吗?_C_Assembly_Mips - Fatal编程技术网

C 有人能和我一起看一下这个MIPS代码吗?

C 有人能和我一起看一下这个MIPS代码吗?,c,assembly,mips,C,Assembly,Mips,我的第一个问题是 调整堆栈空间时,为什么选择数字8?我假设它意味着8个字节,但是如何确定需要调整8个字节呢?我知道我们应该为所有参数(在本例中为一个参数)分配足够的空间,我也在猜测返回地址,但是我们如何知道每个参数需要多少字节呢 我试图通读代码以了解发生了什么,但我在一个问题上感到困惑 beq$t0,$0,L1 我知道,从这里我们分支到L1,其中n减1,但我很困惑。做 日航事实 意思是我们立即返回到上面的事实,但是这次的参数是n=1而不是n=2?[假设n=2是我们的原始参数]我们在什么时候到达代

我的第一个问题是

  • 调整堆栈空间时,为什么选择数字8?我假设它意味着8个字节,但是如何确定需要调整8个字节呢?我知道我们应该为所有参数(在本例中为一个参数)分配足够的空间,我也在猜测返回地址,但是我们如何知道每个参数需要多少字节呢

  • 我试图通读代码以了解发生了什么,但我在一个问题上感到困惑

  • beq$t0,$0,L1

    我知道,从这里我们分支到L1,其中n减1,但我很困惑。做

    日航事实

    意思是我们立即返回到上面的事实,但是这次的参数是n=1而不是n=2?[假设n=2是我们的原始参数]我们在什么时候到达代码,它说乘以$a0和$v0

    老实说,我真的很难把我的脑子都想起来。如果我理解的话,每次调用阶乘函数时,都会向堆栈中添加一个新的“堆栈帧”…每个帧向堆栈中分配8个字节?每个新帧都包含一个返回地址,用于返回调用它的过程。如果我理解正确,我在代码中很难看到它。

    答案1在代码注释中:
    这个“8”取决于您的代码,它是图片中的“n”

    8字节,因为您需要两个值的位置。每个整数值有4个字节…
    这些值是一个参数和返回地址。
    (调用方和被调用函数有两个单独的返回地址,
    但登记册上只有一个地方。
    因此,调用方将其地址临时保存在堆栈上)

    关于beq的
    
    对的如果
    $t0
    $zero
    相等(即
    $t0
    的值为0),则跳转到
    L1

    关于日航

    用一两个词来说:这是一个函数调用,没有跳转

    如果没有函数调用或跳转,则代码将自上而下处理,每个指令都将启动。
    想象一下,你的电脑中有东西指向你现在所在的位置。
    因此,如果要处理jal,它将指向jal指令。
    那里发生了什么:
    您将获得另一个指向事实的第一条指令的指令指针,
    当第一辆车停在日航时
    然后,第二个指针将从函数的顶部向下移动,
    而第一个仍然留在原来的位置。
    直到第二个指针到达终点:
    jr

    此时,第二个指针再次被删除,
    第一个将在之前停止的位置继续。

    递归的“魔力”在于,第二个指针可以产生第三个

    等等他,等等……

    把文字放在这里,而不是超大的图片怎么样?你描述得很好,真的很有帮助。