跳转而无需更改堆栈

时间:2018-12-18 20:31:09

标签: z80

我正在尝试制作一个子程序,该子程序打印一个以空值终止的字符串,但是它不起作用。在我的第一次尝试中:

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

这也以失败告终,因为由于某种原因它不断重复字符串的第一个字符。发生了什么,我该怎么解决?

1 个答案:

答案 0 :(得分:0)

模拟器不正确。即使不执行,它也会在执行jp指令时更改堆栈。我将寻找其他模拟器。不要使用ZEMU仿真器。