问题描述
第一个输入/操作数是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 (将#修改为@)