4

我正在开发一个 Gameboy 模拟器,我已经在 ROM 中获得操作码0xD1(弹出DE堆栈)但堆栈为空(没有推送任何值)。所有未知的操作码都返回错误,所有其他指令似乎都工作正常。

这是我的编程错误,ROM,还是这只是程序设置为的快速DE方法0x0000

4

1 回答 1

6

即使没有值被PUSH写入堆栈,POP也会将存储在地址中的值检索SP到指定的寄存器对中,并将SP增加2.

在您的示例中,如果SP已初始化为 ,wD000并且 WRAM 已0预先初始化为 ,POP DE则将有效地加载0DE,并增加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.

于 2015-10-26T02:53:22.247 回答