我正在尝试制作一个子程序,该子程序打印一个以空值终止的字符串,但是它不起作用。在我的第一次尝试中:
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
这也以失败告终,因为由于某种原因它不断重复字符串的第一个字符。发生了什么,我该怎么解决?
答案 0 :(得分:0)
模拟器不正确。即使不执行,它也会在执行jp
指令时更改堆栈。我将寻找其他模拟器。不要使用ZEMU仿真器。