Алгоритмическая проблема в MIPS - PullRequest
0 голосов
/ 22 июля 2010

Я переписываю свои ответы на вопросы Project Euler в сборке MIPS, и я не могу получить этот ответ для получения правильного ответа.Я прошел через код за последний час, и я не могу понять, что не так с моим подходом (так как я получаю 33165, когда ответ круто на 200,00+ выше), поэтому я решаю проблемудолжно быть моя шаткость с синтаксисом.Есть ли что-то глупое, что я делаю здесь, например, использование зарезервированного регистра?

## 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.:(

1 Ответ

1 голос
/ 22 июля 2010

Увеличивая $ 9 на 3 в каждом цикле, вы пропускаете множество кратных 5, начиная с 5 ...

ОБНОВЛЕНИЕ: ветвлением, когда $9 не делитсяна 3, а затем на 5 вы сохраняете кратные только 3 и 5.

ОБНОВЛЕНИЕ: вы должны удалить следующую строку:

bne     $13, $0, retry  # if n mod 3 != 0 then retry
...