我正在使用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
的快捷方式?
答案 0 :(得分:5)
即使没有值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
。