2010-07-22 2 views
0

MIPS 어셈블리의 Project Euler 질문에 내 대답을 다시 쓰고 있는데 올바른 대답을 출력 할 수 없습니다. 지난 1 시간 동안 코드를 살펴 봤는데, 내 접근법에 무엇이 잘못되었는지를 알아낼 수 없습니다. (답은 멋진 200,00+ 이상일 때 33165를 얻음에 따라) 문제를 파악합니다. 그 문법에 어색해 져야합니다. 예약 된 레지스터를 사용하는 것처럼 내가 여기서하고있는 바보 같은 것이 있습니까?MIPS의 알고리즘 문제

## 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 

편집 : 게시되고 있기 때문에 조정 코드입니다. 제안 된 수정안을 제안했지만 약 10 만 건의 응답을 제공합니다. 5 다음 $9가 3의 배수가 아닌 경우 분기에 의해, 그리고 : :(

+0

: 당신은 다음 줄을 제거해야합니다 등록 번호 대신 이름이 필요하십니까? $ a0, $ a1, $ t0 등? – Tom

+0

나는 이렇게 작은 프로그램을 위해 그것이 필요하지 않다고 생각했다. – Andy

답변

1

각 루프에서 3까지 $ 9 증가하면 ... 5을 시작으로 5

UPDATE를 많은 배수를 놓치고있어 만 3 5

UPDATE의 배수를 유지하고 있습니다 : 당신은 왜 레지스터를 사용하여이 arent

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

와우 ... 나는 그것을 놓친 걸 믿을 수 없어, 고마워. 불행히도 여전히 정확한 답을 산출하지 못합니다. – Andy

+0

당신이 지적한 수정안을 만들었고 또 다른 변화를 만들었습니다. (제 생각에 그것은 꽤 늦었습니다) 그러나 지금은 약 100K 정도 떨어져있는 166,833을 산출 중입니다. 코드는 오늘 밤에 마지막으로 업데이트됩니다.하지만 침대로 끌고 갈 필요가 있다고 생각합니다. 나의 루키 실수를 찾아 주셔서 고마워요. :) – Andy