c++ - 使用递归和乘法将 C 代码转换为 MIPS 问题

标签 c++ c mips

大家好,我需要一些帮助将以下 C 代码转换为 MIPS:

main()
{
  int i;
  for (i=0;i<5;++i)
    power(2,1)
    factorial(i)
return 0;
}
int power(int base,int n)
{
  int i,p;
  p=0;
  for(i=1;i<=n;++i)
    p=p*base;
  return p;
}
int factorial(int a)
{
  if(a==1)
    return 1;
  else
  {
    a *=factorial(a-1);
    return a;
  }
}

到目前为止我只完成了阶乘部分,但我陷入了a*=factorial(a-1),我明白multi用于将两个寄存器相乘,但它如何获取递归的输入环形?是否也可以乘以一个常量而不是另一个寄存器?

factorial:
addi        $sp, $sp, -8 #adjust stack for 2 items
sw      $ra, 4($sp) #save return address
sw      $a0, 0($sp) #save argument
bne     $a0, 1, Else #if !(a==1), go to else address
addi        $v0, $zero, 1 #result is 1
addi        $sp, $sp, 8 #pop 2 items from stack
jr      $ra     #return
Else:  addi $a0, $a0, -1 #decrement s-1
jal     factorial   #recursive call
lw      $a0, 0($sp) #restore original a
lw      $ra, 4($sp) #and return address
addi        $sp, $sp, 8 #pop two items from stack

最佳答案

这是我编写的代码,我认为它适合您的目的。

.text
factorial:
    li $t0,13       # load 13 to check for overflow
    blt  $a0,$t0,no
    li $v1,1
    no: 
    bgtz $a0,find       # if $a0>0 goto generic case
    li $v0, 1       # base case, 0! = 1 
    jr $ra       
find:   sub $sp,8       # make room for $s0 and $ra
    sw $s0,($sp)        # store argument $s0=n
    sw $ra,4($sp)       # store return address
    move $s0, $a0       # save argument 
    sub $a0, 1      # factorial(n-1) 
    jal factorial       # v0 = (n-1)! 
    mul $v0,$s0,$v0     # n*(n-1)! 
    lw $s0,($sp)            # restore $s0=n
    lw $ra,4($sp)       # restore $ra
    add $sp,8       # reduce stack size
    jr $ra          # return 


main: 
    la $a0,input
    li $v0,4
    syscall
    li $v0,5
    syscall
    move $a0,$v0
    jal factorial
    move $t0,$v1
    bnez $t0,overflow1
    move $a0,$v0
    li $v0,1
    syscall
    b end
    overflow1:
    la $a0,overflow
    li $v0,4
    syscall
    end:
    li $v0,10
    syscall
.data
input:.asciiz"Input a number:"
overflow:.asciiz"There is an overflow!!"

它包含注释和解释,因此应该不会有问题。

关于c++ - 使用递归和乘法将 C 代码转换为 MIPS 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12719411/

相关文章:

c++ - 这个右值签名模式有意义吗?

c - Glib 线程与 GMain 循环事件

assembly - 如何在 MIPS Assembly 中执行递归操作?

if-statement - C 到 MIPS 我如何转换 if else 语句

c - C 中的 fopen 不会创建文件

unicode - 如何将 UTF-16 转换为 ASCII

我的 std::map of &Objects 和 std::vector of &Objects 导致 C++ 内存泄漏

c++ - 如果我有很多具有相似前缀的字符串,是否有理由从该前缀创建一个子字符串?

c++ - 使用 std::result_of 的意外 SFINAE 失败

比较 C 中的 2 个字符串数组