C 在MIPS编程中使用递归调用查找数字的阶乘
这是C源代码C 在MIPS编程中使用递归调用查找数字的阶乘,c,assembly,mips,mars-simulator,C,Assembly,Mips,Mars Simulator,这是C源代码 #包括 int main(){ printf(“10的阶乘是%d\n”,事实(10)); } 整数事实(整数n){ if(n
#包括
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
进行正常的直接跳转。