我正在开发一个 Gameboy 模拟器,我已经在 ROM 中获得操作码 0xD1
(pop DE
off stack) 但栈是空的(没有值被压入栈中)。所有未知的操作码都会返回错误,所有其他指令似乎都可以正常工作。
是我的程序、ROM 中的错误,还是这只是程序设置 DE
的一种快速方法?至 0x0000
?
最佳答案
即使没有值已经 PUSH
编辑到堆栈,POP
将检索存储在 SP
中的地址处的值到指定的寄存器对,和 SP
将增加 2
.
在您的示例中,如果 SP
已初始化为,例如 wD000
,并且 WRAM 被初始化为 0
事先,POP DE
将有效加载 0
至 DE
,并增加 Stack Pointer
来自 2
.
21 00 C0 ld hl,C000 ;Start of WRAM
01 FF 1F ld bc,1FFF ;Length of WRAM
AF xor a ;a = 0
22 ldi (hl),a ;Blanks WRAM
0B dec bc
78 ld a,b
B1 or c
20 F9 jr nz,0158 ;Loops until WRAM is cleared
21 00 D0 ld hl,D000
F9 ld sp,hl ;SP = 0xD000
D1 pop de ;de = 0x0000, SP = 0xD002
另外,请注意
CALL
指令将返回地址压入堆栈,并递减 SP
来自 2
.同理,RET
从堆栈中检索地址,并增加 SP
来自 2
.
关于emulation - Gameboy 模拟器弹出空堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33334734/