2014-04-23 33 views
0

需要使用Mips Assembly Lang來計算萊布尼茨系列派的幫助。萊布尼茲系列幫助組裝語言

我會輸入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

有兩個問題yes前比較:

1)$f4永遠不會是負的,所以比較會經常去yes,你會總是在添加方面的總和。 2)如果$f4曾經是負數,並且檢查轉到下一行,則在減法後丟失j loop;如果$f4是負數,並且檢查轉到下一行,則在減法後丟失j loop;如果$f4是負數,它會減去然後直接流入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。