0

MIPS アセンブリで Project Euler の質問に対する回答を書き直していますが、これで正しい回答を出力できません。私は過去1時間コードを調べましたが、私のアプローチの何が問題なのかわかりません(答えがそれより200,00以上高いクールなときに33165を取得しているため)、問題を理解します構文に対する私の不安定さに違いありません。予約済みレジスタを使用するなど、私がここで行っている愚かなことはありますか?

## p1.asm
## 
## Andrew Levenson, 2010
## Project Euler, Problem 1
## In MIPS Assembly for SPIM

## Calculate the sum, s, 
## of all natural numbers, n,
## Such that n < 1000.
        .text
        .globl  main

main:
        ori     $8, $0, 0x0     # Init sum s in $8 to 0
        ori     $9, $0, 0x0     # Init variable number n in $9 to 0
        ori     $10, $0, 0x3    
        ori     $11, $0, 0x5
        la      $14, lim         


loop:
retry:
        addiu   $9, $9, 0x1     # Increment n by 1

    # Is n less than 1000?
        sltiu   $15, $9, 1000   # if n >= 1000 then jump to print
        beq     $15, $0, print  # if $15 == 0 

        sll     $0, $0, $0      # no op


    # Is n a multiple of three or five?
        div     $9, $10         # n / 3
        mflo    $12             # $12 = floor( n / 3 ) 
        mfhi    $13             # $13 = n mod 3 

        bne     $13, $0, retry  # if n mod 3 != 0 then retry
        sll     $0, $0, $0      # no op
        beq     $13, $0, sum    # else, print
        sll     $0, $0, $0      # no op

        div     $9, $11         # n / 5
        mflo    $12             # $12 = floor( n / 5 ) 
        mfhi    $13             # $13 = n mod 5 

        bne     $13, $0, retry  # if n mod 5 != 0 then retry
        sll     $0, $0, $0      # no op

    # If we've made it this far, n is good!
sum:
        addu    $8, $8, $9      # s = s + n

        j       loop            # jump to loop
        sll     $0, $0, $0      # no op


print:
        li      $v0, 1          # system call #1 - print int
        move    $a0, $8
        syscall                 # execute

exit:   
        li      $v0, 0xA        # system call #10 - exit
        syscall 



## End of Program

## Variable declarations    
                .data
lim:            .word   1000    # loop bound

編集:投稿されてから調整されたコード。修正が提案されましたが、それでも約 100,000 の回答が得られます。:(

4

1 に答える 1

1

ループごとに$9 ずつインクリメントすることで、 ...から始まる3の倍数が多数失われます。55

更新: が$93 で割り切れない場合に分岐し、次に 5 で分岐すると、35 の倍数のみが保持されます。

更新: 次の行を削除する必要があります。

bne     $13, $0, retry  # if n mod 3 != 0 then retry
于 2010-07-22T06:42:41.020 に答える