assembly - 优化 DCPU-16 FizzBu​​zz

标签 assembly fizzbuzz dcpu-16

我尝试在 DCPU-16 中实现 FizzBu​​zz。我使用这个网络模拟器: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 FizzBu​​zz,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10044665/

相关文章:

c++ - "lock add"在x86处理器上是如何实现的

ios - __attribute __((constructor))对于iOS编译成什么?如何在手写的asm中进行?

assembly - 指令大小是什么意思?

dcpu-16 - DCPU-16 中的签名算术/控制流?

assembly - 为什么DCPU-16指令的二进制表示中有一个前导1

c++ - 在 L1/L2 中快速合并 4K float 的排序子集

python - 试图将 fizzbuzz 变成 python 3 中的函数

java - FizzBu​​zz 在 Java 中使用方法

c++ - Facebook 拼图错误 : throws it's automated mail regarding build/run error

assembly - DCPU-16 不接受键盘输入