2012-04-06 5 views
4

DCPU-16にFizzBu​​zzを実装しようとしました。私はこのWebエミュレータを使用しています:http://mappum.github.com/DCPU-16/(リポジトリ:https://github.com/mappum/DCPU-16)。DCPU-16 FizzBu​​zzの最適化

ループの終了前に停止します。どうして?

どうすれば最適化できますか? 私は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です。

あなたはコンソールの最後を叩いているように見えるので、あなたの出力は中間の文字をカットし、無関係のメモリに書き込まれます。

デバッガを見ると、レジスタIはcompeletionで0x64で、ベース10では100です(ループが終了します)。