2012-04-06 2 views
4

DCPU-16에 FizzBuzz를 구현하려고했습니다. 이 웹 에뮬레이터를 사용합니다 : http://mappum.github.com/DCPU-16/ (저장소 : https://github.com/mappum/DCPU-16).DCPU-16 FizzBuzz 최적화

루프 종료 전에 중지됩니다. 왜?

어떻게 최적화 할 수 있습니까? 나는 asm에 관해서 아무 것도 모르는 고급 언어 프로그래머이다. 이 부분에 리소스가 있습니까? DCPU-16에

더 많은 정보를 정기적으로 공식 사양 : http://0x10c.com/doc/dcpu-16.txt - 비공식 사양 : http://0x10.cc/

코드 :

; FizzBuzz in DCPU-16 

SET Z, 0x8000 
SET I, 1 


:loop 
    JSR print 
    ADD I, 1 
    IFN I, 100 
     SET PC, loop 

    BRK 


:print 
    ADD Z, 1 
    SET [Z], 10 

    SET A, I 
    MOD A, 3 
    IFE A, 0 
     JSR printFizz 

    SET B, I 
    MOD B, 5 
    IFE B, 0 
     JSR printBuzz 

    SET C, A 
    IFG B, A 
     SET C, B 
    ADD A, B 
    IFG A, C 
     JSR printNumber 

    SET PC, POP 


:printNumber 
    SET A, I 

    IFG I, 9 
     DIV A, 10 

    JSR printDigit 

    IFG 10, I 
     SET PC, POP 

    SET A, I 
    MOD A, 10 

    JSR printDigit 
    SET PC, POP 

:printDigit 
    ADD A, 48 
    ADD Z, 1 
    SET [Z], A 
    SET PC, POP 

:printFizz 
    ADD Z, 1 
    SET [Z], 70 
    ADD Z, 1 
    SET [Z], 105 
    ADD Z, 1 
    SET [Z], 122 
    ADD Z, 1 
    SET [Z], 122 
    SET PC, POP 

:printBuzz 
    ADD Z, 1 
    SET [Z], 66 
    ADD Z, 1 
    SET [Z], 117 
    ADD Z, 1 
    SET [Z], 122 
    ADD Z, 1 
    SET [Z], 122 
    SET PC, POP 
+0

fizzbuzz 최적화에 대한 몇 가지 아이디어가 필요하다면, 내 C fizzbuzz를 최대한 (네이티브 함수를 사용하지 않고) 만들 수 있습니다 : http://pastie.org/3739291. 사용 된 주요 기술은 루프 언 롤링입니다. – Matt

+2

DCPU16의 컨텍스트에서 "최적화"란 무엇입니까? 지시 사항이 덜 있습니까? – lunixbochs

+0

@lunixbochs,주기가 짧습니다. 사이클은 이미 문서화되어 있습니다. – Matt

답변

2

그 에뮬레이터 콘솔 공간은 0x8000 - 0x8180입니다.

콘솔의 끝을 치는 것처럼 보이므로 출력이 중간 글자를 자르고 관련없는 메모리에 쓰게됩니다.

디버거를 보면 : compeletion에서 레지스터가 0x64이고 밑이 10 인 경우 100입니다 (루프가 완료되었습니다).