2012-04-06 1 views
4

Я попытался реализовать FizzBuzz в DCPU-16. Я использую этот веб-эмулятор: 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.

Похоже, вы попадаете в конец консоли, поэтому ваш выход срезает середину буквы, и вы заканчиваете писать в несвязанную память.

Если вы посмотрите в отладчике: регистр I равен 0x64 при compleletion, который равен 100 в base-10 (так что ваш цикл завершен).