需要帮助使用Mips Assembly Lang计算leibniz系列饼图。
我会输入10000,它会从馅饼中走得更远。我想我的公式可能错了吗?我不确定。我使用条件分支来确定该术语是否大于零或小于。
.text
.globl main
main:
la $a0,prompt # print string
li $v0,4 # service 4
syscall
li $v0,5 # read int into $v0
syscall # service 5
#Evaluate Pie
move $t2,$v0 #Move user number into $s0
li $t1,1 #Loop counter
li.s $f2,0.0 #Sum
li.s $f4,0.0 #Add to sum
li.s $f6,0.0 #Comparison 0.0
li.s $f8,1.0 #Use as floating i
li.s $f10,1.0 #Temp 1.0
li.s $f14,2.0 #Constant 2.0
loop:
beq $t1,$t2,done #While 1<User Input Cont
mul.s $f4,$f14,$f8 #2.0*I
add.s $f4,$f4,$f10 #2.0*I+1.0
div.s $f4,$f10,$f4 #1.0/2.0*I+1.0
addi $t1,$t1,1 #Increment Loop Counter
add.s $f8,$f8,$f10 #Increment Float I
c.lt.s $f6,$f4 #Is 0.0 < Add to sum
bc1t yes
sub.s $f2,$f4,$f2 #No so subtract
yes: add.s $f2,$f4,$f2 #Yes so add
j loop
done:
mov.s $f12,$f2 #Move sum to float print
li $v0,2 # print sum
syscall
li $v0,10 # exit
syscall
##
## Data Segment
##
.data
prompt: .asciiz "Enter number of terms: "
答案 0 :(得分:1)
yes
之前的比较存在两个问题:
1)$f4
永远不会是否定的,因此比较将始终转到yes
,并且您总是会在总和中添加字词。
2)如果$f4
为负数且支票转到下一行,则您在减法后错过了j loop
;它将减去然后直接进入yes
标签,这将取消减法。
sub
上的操作数顺序是向后的(sub $a,$b,$c
将执行$a = $b - $c
)。您还需要将浮动i
设置为0而不是1。
通过所有这些修复,我得到:
...
li.s $f8,0.0 #Use as floating i
...
loop:
beq $t1,$t2,done #While 1<User Input Cont
mul.s $f4,$f14,$f8 #2.0*I
add.s $f4,$f4,$f10 #2.0*I+1.0
div.s $f4,$f10,$f4 #1.0/2.0*I+1.0
addi $t1,$t1,1 #Increment Loop Counter
add.s $f8,$f8,$f10 #Increment Float I
andi $t3,$t1,1
beq $t3,$zero,even
sub.s $f2,$f2,$f4
j loop
even:
add.s $f2,$f4,$f2
j loop
...
输出0.78542465,大致为pi / 4。