Оптимизация DCPU-16 FizzBuzz

Я пытался реализовать FizzBuzz в DCPU-16. Я использую этот веб-эмулятор: http://mappum.github.com/DCPU-16/ (репозиторий: https://github.com/mappum/DCPU-16).

Останавливается до конца цикла. Зачем?

Как я могу оптимизировать это? Я программист высокого уровня, который ничего не знает об асме. У вас есть какой-то основной ресурс по этому вопросу?

Дополнительная информация о 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

1 ответ

Решение

Консольное пространство на этом эмуляторе только 0x8000 - 0x8180,

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

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

Другие вопросы по тегам