我正在开发一个 Gameboy 模拟器,我已经在 ROM 中获得操作码0xD1(弹出DE堆栈)但堆栈为空(没有推送任何值)。所有未知的操作码都返回错误,所有其他指令似乎都工作正常。
这是我的编程错误,ROM,还是这只是程序设置为的快速DE方法0x0000?
即使没有值被PUSH写入堆栈,POP也会将存储在地址中的值检索SP到指定的寄存器对中,并将SP增加2.
在您的示例中,如果SP已初始化为 ,wD000并且 WRAM 已0预先初始化为 ,POP DE则将有效地加载0到DE,并增加Stack Pointerby 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.