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_Mars Simulator - Fatal编程技术网

C 在MIPS编程中使用递归调用查找数字的阶乘

C 在MIPS编程中使用递归调用查找数字的阶乘,c,assembly,mips,mars-simulator,C,Assembly,Mips,Mars Simulator,这是C源代码 #包括 int main(){ printf(“10的阶乘是%d\n”,事实(10)); } 整数事实(整数n){ if(n

这是C源代码

#包括
int main(){
printf(“10的阶乘是%d\n”,事实(10));
}
整数事实(整数n){
if(n<1)
申报表(1);
其他的
返回(n*事实(n-1));
}
我正在将C编程函数转换为MIPS,但是当我运行MIPS程序时,我得到了一个.ascii部分的错误

    .text
    .globl main
main:
    subu    $sp,$sp,32  # Stack frame is 32 bytes long
    sw  $ra,20($sp)     # Save return address
    sw  $fp,16($sp)     # Save old frame pointer
    addiu   $fp,$sp,28  # Set up frame pointer

    li  $a0,10      # Put argument (10) in $a0
    jal     fact        # Call factorial function
    la  $a0,$LC     # Put format string in $a0
    move    $a1,$v0     # Move fact result to $a1
    jal     printf      # Call the print function

    lw  $ra,20($sp)     # Restore return address
    lw  $fp,16($sp)     # Restore frame pointer
    addiu   $sp,$sp,32  # Pop stack frame
    jr  $ra         # Return to caller
    
    .rdata
$LC:
    .ascii “The factorial of 10 is %d\n\000”

    .text
fact:
    subu    $sp,$sp,32  # Stack frame is 32 bytes long
    sw  $ra,20($sp)     # Save return address
    sw  $fp,16($sp)     # Save frame pointer
    addiu   $fp,$sp,28  # Set up frame pointer
    sw  $a0,0($fp)  # Save argument (n) to use for Recursive Call
    
    lw  $v0,0($fp)  # Load n
    bgtz    $v0,$L2     # Branch if n > 0
    li  $v0,1       # Return 1
    jr  $L1         # Jump to code to return
$L2:
    lw  $v1,0($fp)  # Load n
    subu    $v0,$v1,1   # Compute n - 1
    move    $a0,$v0     # Move value to $a0
    
    jal     fact        # Call factorial function
    lw  $v1,0($fp)  # Load n
    mul     $v0,$v0,$v1     # Compute fact(n-1) * n
    
$L1:                # Result is in $v0
    lw  $ra, 20($sp)    # Restore $ra
    lw  $fp, 16($sp)    # Restore $fp
    addiu   $sp, $sp, 32    # Pop stack
    jr  $ra         # Return to caller
它给了我一个.ascii代码部分的错误,说它不应该在.text中:

“.ascii”指令中的错误不能出现在文本段中

它还说:

“$L1”:操作数的类型不正确

它给了我一个.ascii代码部分的错误,说它不应该在.text中:

“.ascii”指令中的错误不能出现在文本段中”

我在这里有点冒险,因为我不能100%确定你在运行什么,但是像火星这样的模拟人生不识别rdata段。你可以尝试使用
.data

此外,如果您使用的是WinMIPS64之类的软件,您可能希望尝试将.data段放在代码的顶部。我知道您所做的在某些环境中是正确的,但在其他环境中不起作用,所以请尝试一下

我建议你单独试试这些东西,以防万一

它给了我一个.ascii代码部分的错误,说它不应该在.text中:

“.ascii”指令中的错误不能出现在文本段中”

我在这里有点冒险,因为我不是100%确定你在运行什么,但是像火星这样的模拟人生不认识rdata段。您可以尝试只使用
.data

此外,如果您使用的是类似WinMIPS64的程序,您可能希望尝试将.data段放在代码的顶部。我知道你所做的在某些环境中是正确的,但在其他环境中不起作用,所以试一下


我建议您单独试用这些东西,以防万一。

谢谢您的帮助!,我确实尝试过使用.data将ascii码一直放在最上面,而且效果很好!如果我的答案对你有用,你能投赞成票或接受它作为答案吗?谢谢你的帮助!,我确实尝试过使用.data将ascii码一直放在最上面,而且效果很好!如果我的答案对你有用,你能投赞成票或接受它作为答案吗?参考:
jr
获取寄存器。使用
jl1
进行正常的直接跳转。
jr
获取寄存器。使用
jL1
进行正常的直接跳转。