Gameboy模拟器弹出空堆栈

时间:2015-10-25 20:29:02

标签: pop emulation gameboy

我正在使用Gameboy模拟器,我已经在ROM中找到了一个点,我得到操作码<div id="container" style="text-align:center ;border: 5px solid blue; display:flex; flex-direction:row ; justify-content:center; height:100px"> <div id="first" style=" min-height:100px; min-width:200px; background-color:green"> <div style="vertical-align:middle"> first box </div> </div> <div id="second" style=" min-height:100px; min-width:200px; background-color:yellow"> <div style="vertical-align:middle"> second box </div> </div> <svg version="1.1" id="SVG" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 300 300" preserveAspectRatio="xMidYMid meet" height="100%" width: "auto"> <!--snipped away svg code--> </svg> <div id="third" style="min-height:100px; min-width:200px; background-color:red"> <div style=""> third box </div> </div> <div id="fourth" style="min-height:100px; min-width:200px; background-color:cyan; vertical-align:middle "> <p> fourth box </p> </div> </div>(弹出0xD1关闭堆栈)但是堆栈是空的(没有任何值被推到它上面)。所有未知的操作码都返回错误,所有其他指令似乎都正常工作。那应该怎么办?这是我的编程,ROM中的错误,还是这只是程序将DE设置为DE的快捷方式?

1 个答案:

答案 0 :(得分:5)

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

在您的示例中,如果已将SP初始化为wD000,并且事先已将WRAM初始化为0POP 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