Gameboy处理器LR35902操作码0x08含义

use*_*487 2 z80 gameboy

有人可以解释一下操作码0x08在LR35902处理器上的作用.助记符是LD (a16),SP.

我很困惑,因为堆栈指针是一个16位的值,但是(a16)某个地址只能存储8位(我想!).我可以猜到前8位被放入(a16),而下一位被放在那些旁边,但我想要确认.

cre*_*ker 8

是的,该操作码将SP值放在一个地址(a16).这是它的样子:

void MemoryWrite(uint16_t addr, uint8_t value);

MemoryWrite(a16, SP & 0xFF);
MemoryWrite(a16 + 1, (SP & 0xFF00) >> 8);
Run Code Online (Sandbox Code Playgroud)

因为它是一个小端处理器,所以首先放置最低有效字节.

  • 我认为这不是必要的.首先,不要认为有人会制作一个写入会溢出uint16_t的地址的游戏.此外,它会覆盖看起来不像人们会做的堆栈.其次,uint16_t无论如何都会缠绕,它不是一个未定义的行为. (2认同)
  • @creker 正确!执行“LD (0xFFFF), SP”时,内存位置“0xFFFF”将具有 SP 最低有效位。内存指针回绕,CPU 将尝试在内存位置“0x0000”上写入。不会发生任何事情,因为“0x0000”是只读的。 (2认同)
  • @GabrielOshiro,好吧,不是很只读.它不会覆盖任何东西,但可以触发MBC.您可能知道,MBC通过写入只读地址进行编程.例如,写入0x0000将触发MBC1中的外部RAM并触发MBC3中的RAM/RTC.但模拟器不应该检查.你做ROM告诉你的事情. (2认同)