Оптимизация 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 (так что ваш цикл завершен).