2012-04-06 8 views
4

Ich habe versucht, FizzBuzz in DCPU-16 zu implementieren. Ich verwende diesen Web-Emulator: http://mappum.github.com/DCPU-16/ (Repository: https://github.com/mappum/DCPU-16).Optimieren DCPU-16 FizzBuzz

Es stoppt vor dem Ende der Schleife. Warum?

Wie kann ich es optimieren? Ich bin ein hochsprachiger Programmierer, der nichts über asm weiß. Haben Sie einige grundlegende Ressource auf diesem?

Mehr Infos auf DCPU-16: offizielle Brille: http://0x10c.com/doc/dcpu-16.txt - inoffizielle Angaben: http://0x10.cc/

Der Code:

; 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

Wenn Sie ein paar Ideen für die Optimierung eines Fizzbuzz wollen, hier ist meine C fizzbuzz so optimal wie möglich gemacht (ohne native Funktionen zu verwenden): http://pastie.org/3739291. Die verwendete Haupttechnik ist das Loop-Abrollverfahren. – Matt

+2

Was bedeutet "optimieren" im Zusammenhang mit DCPU16? Weniger Anweisungen? – lunixbochs

+0

@lunixbochs, weniger Zyklen. Zyklen sind bereits gut dokumentiert. – Matt

Antwort

2

Die Konsole Platz auf diesem Emulator ist nur 0x8000 - 0x8180.

Sieht aus, als würden Sie das Ende der Konsole treffen, so dass Ihre Ausgabe mitten in einem Brief abgeschnitten wird und Sie am Ende in nicht verwandten Speicher schreiben.

Wenn Sie in den Debugger schauen: Das Register I ist 0x64 bei Completion, das ist 100 in der Basis-10 (also Ihre Schleife beendet).