跳转而不改变堆栈

Jump without altering the stack

我正在尝试创建一个子例程来打印空终止字符串,但它不起作用。在我的第一次尝试中:

PRINTLN:   ld   a, (bc)     // set bc to start of string before calling
           add  a, 0        // update zero flag
           jp   z, endprint // if the character at (bc) is a null, terminate loop
           out  1, a        // output to port 0 (TTY in emulator)
           inc  bc          // point to next character
           jp   println     // rinse and repeat
ENDPRINT:  ret              // end of subroutine

它只是重复字符串,直到由于某种原因停止。我的模拟器不允许我查看堆栈。 下一次尝试是将 PRINTLN 的地址放在循环之前的 de ,然后只需按下 de 并使用 ret 而不是 jp:

PRINTLN:   ld   de, printloop // attempt to get rid of jp's effect on the stack
PRINTLOOP: ld   a, (bc)       // set bc to start of string before calling
           add  a, 0          // update zero flag
           jp   z, endprint   // if the character at (bc) is a null, terminate loop
           out  1, a          // output to port 0 (TTY in emulator)
           inc  bc            // point to next character
           push de            // I hope this works
           ret                // rinse and repeat
ENDPRINT:  ret                // end of subroutine

这也以失败告终,因为它出于某种原因一直重复字符串的第一个字符。这是怎么回事,我该如何解决?

模拟器不准确。它在执行 jp 指令时会更改堆栈,即使它不应该这样做。我会寻找一个不同的模拟器。不要使用 ZEMU 模拟器。