跳转而不改变堆栈
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 模拟器。
我正在尝试创建一个子例程来打印空终止字符串,但它不起作用。在我的第一次尝试中:
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 模拟器。