我尝试在 DCPU-16 中实现 FizzBuzz。我使用这个网络模拟器:http://mappum.github.com/DCPU-16/ (存储库: https://github.com/mappum/DCPU-16 )。
它在循环结束前停止。为什么?
我该如何优化它?
我是一个高级语言程序员,对 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
最佳答案
该模拟器上的控制台空间仅为 0x8000 - 0x8180
.
看起来您正在击中控制台的末尾,因此您的输出切断了中间字母,最终写入了不相关的内存。
如果您查看调试器:完成时寄存器 I 为 0x64,基数为 10 时为 100(因此您的循环已完成)。
关于assembly - 优化 DCPU-16 FizzBuzz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10044665/