莱布尼兹系列帮助组装Lang

时间:2014-04-23 15:14:37

标签: assembly mips

需要帮助使用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: "   

1 个答案:

答案 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。