如何在MIPS中编写计算阶乘的代码?

3
问题陈述:请写一个循环来计算$t0中存储的正整数的阶乘,并在4个指令中将结果存储在$t1中。
这是我目前的代码,我相信它能工作,但需要6个指令。
       li $t3, 1
       move $t1, $t0
       move $t2, $t0
 LOOP: addi $t2, $t2, -1
       mul $t1, $t1, $t2
       bne $t2, $t3, LOOP

编辑。 这是解决方案。

 li $t1 1 
 LOOP: mul $t1 $t1 $t0 
 addi $t0 $t0 -1 
 bgez $t0 LOOP 

提示:从$t1 == 1开始会更有效(就代码大小而言)。没有必要使用除$t0$t1(以及$zero)以外的任何其他寄存器。如果我们要严格一点,li不是真正的MIPS指令。它是汇编程序提供的伪指令。 - Michael
дЄЇдЇЖжЫіеК†дЄ•ж†ЉпЉМli $t3,1 襀蚐жНҐжИР ori $t3,$zero,1пЉМињЩжШѓдЄАжЭ°еНХзЛђзЪДжМЗдї§ :-) - markgz
4个回答

3
 li $t1 1 
 LOOP: mul $t1 $t1 $t0 
 addi $t0 $t0 -1 
 bgez $t0 LOOP 

0
 .data

 msg: .asciiz "Enter a number"
 answer: .asciiz "\nFactorial is: "

 .text


 li $v0, 4
 la $a0, msg
 syscall

 li $v0, 5
 syscall


 move $a0, $v0
 li $v0, 1
 syscall

 jal calculate_factorial
 move $a1, $v0

 li $v0, 4
 la $a0, answer
 syscall

 move $a0, $a1
 li $v0, 1
 syscall

   li $v0, 10
   syscall

    calculate_factorial:
       addi $sp, $sp-4
       sw $ra, ($sp)

       li $v0, 1
       multiply:
        beq $a0, $zero, return
        mul $v0, $v0, $a0
        addi $a0, $a0, -1
        j multiply

    return:
    lw $ra, ($sp)
    jr $ra

当然!添加它。 - Hammad Mughal

0

在qtspim上运行良好。所有行都有小注释以便更好地理解。

记住,当调用函数时,我们应该将其暂时存储在堆栈中,这样即使函数更改寄存器值,我们仍然可以保留来自先前主函数的数据。

    .data
    Enter: .asciiz "Enter value of n: \n"

    .text
    .globl main

main:
    lui $s0, 0x1001

    li $v0, 4                   # print message for i/p
    la $a0, Enter
    syscall

    li $v0, 5                   # get n
    syscall

    add $s1, $v0, $zero         # init n = 5
    li $s2, 1                   # s2 = 1 for base case
    
    add $a0, $s1, $zero         # pass fib(a0)
    jal factorial

    li $v0, 1                   # print result
    add $a0, $v1, $zero
    syscall

    li $v0, 10                  # exit
    syscall

factorial:
    addi $sp, $sp, -8           # grow sp below
    sw $a0, 0($sp)              # store arguments and return addr
    sw $ra, 4($sp)

    bne $a0, $s2, recursion     # n != 1
    add $v1, $s2, $zero
    addi $sp, $sp, 8            # restore $sp and remove stack frame
    jr $ra

    recursion: 
        addi $a0, $a0, -1       # fib(a0 - 1)
        jal factorial

        lw $a0, 0($sp)          # load back a0 to use as a0 * fib(a0-1)
        lw $ra, 4($sp)
        addi $sp, $sp, 8        
        mul $v1, $a0, $v1 

        jr $ra


0
li $s1, 1
LOOP: mul $s1, $s1, $s0
addi $s0, $s0, -1
bgtz $s0, LOOP
将会变成(如果大于0则跳转),会导致阶乘与0相乘并返回0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接