RISC-V 汇编代码中的计算器程序

问题描述

一个输入/操作数是s0,第二个输入是操作(s1),第三个输入是第二个操作数(s2)。
对于第二个输入,s1:
if s1 ==0 : 执行加法
1:减法
2:乘法
3:分区
4:电源功能
5:阶乘函数

问题 1) 已解决

我不知道我的代码有什么问题。如果我先写除法部分,然后是幂函数,无论我将操作(s1)设置为3还是4,它都会继续除法。如果我先写幂函数,然后是除法,它会不断计算A(s0)到B(s2)的幂。

我必须通过切换代码的​​顺序来牺牲一个才能使另一个工作。 QQ

问题 2) 已解决
我应该如何在这里实现阶乘函数?我仍然不明白 (jal/jalr) 递归函数如何在汇编代码中工作。

.globl __start

.rodata
    divide_by_zero: .string "divide by zero"

.text
__start:
    # Read first operand
    li a0,5
    ecall
    mv s0,a0
    # Read operation
    li a0,5
    ecall
    mv s1,a0
    # Read second operand
    li a0,5
    ecall
    mv s2,a0

    li  t1,1  #load immediate
    li  t2,2
    li  t3,3
    li  t4,4
    li  t5,5
    li  t0,0  #counter for power
#Addition
    add s3,s0,s2  #s3=s0+s2
    beq s1,x0,exit  #if(s1==0)
#Subtraction
    sub s3,s2  #s3=s0-s2
    beq s1,t1,exit  #if(s1==1)
#Multiplication
    mul s3,s2  #s3=s0*s2
    beq s1,t2,exit  #if(s1==2)    
#Division
    beq s1,t3,division
#Factorial
    beq s1,t5,fact
#Power
    beq s1,t4,power
    power:
    add t6,x0    #set t6 be s0 (base A)
    addi s3,1    #set s3,return value to 1
    loop:
    bge t0,s2,exit  #if counter>= s2 (power B)
    mul s3,s3,s0   #multiply s3 by s0
    addi t0,t0,1
    jal x0,loop
    
division:
    beq s2,zero_except  #if s2==0,pass to zero_except
    div s3,s2  #s3=s0/s2 (quotient)
    beq s1,exit  #if(s1==3)

fact:
    addi s3,return value to 1
    rep:
    blt s0,exit
    mul s3,s0
    addi s0,-1
    jal x0,rep

exit:
    # Output the result
    li a0,1
    mv a1,s3
    ecall
    # Exit program(necessary)
    li a0,10
    ecall

zero_except:
    # Divide by zero exception
    li a0,4
    la a1,divide_by_zero
    ecall
    # Exit the program(necessary)
    li a0,10
    ecall

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)