【问题标题】:How do I take operands as registers from the byte value?如何将操作数作为字节值的寄存器?
【发布时间】:2014-08-12 19:16:18
【问题描述】:

到目前为止,我有一个相当简单的程序来开始我的仿真体验。我加载一条指令并确定有多少(如果有)操作数,然后我抓取这些操作数并使用它们。对于诸如跳转和推送之类的事情,在我到达寄存器之前它有点简单。我怎么知道操作数何时是寄存器?或者我如何判断它是否是地址处的 而不仅仅是地址(即当他们使用类似 ld (hl),a 的东西时)

我对仿真比较陌生,但我在组装方面有相当多的经验,即使对于 z80 也是如此。

问题

我如何区分寄存器的含义与地址的含义或地址的取消引用之间的区别?

【问题讨论】:

  • 当您遇到仿真的棘手部分(例如计算标志和仿真 daa,或者最糟糕的是仿真外围设备)时,您应该访问omimaga.org。那里有很多 z80 专家,还有很多模拟器作者
  • @harold 谢谢!自从发表这篇文章以来,我实际上学到了很多东西。我成功地用 Javascript 制作了一个 Chip-8 模拟器,现在我正在处理所有 z80 操作码。不过,我肯定会像打断一样检查omimaga :)

标签: emulation z80


【解决方案1】:

因为你解码了指令。例如,在ld (hl), a,即 0x77 或 0b01110111 中,第一个 01 告诉您这是一个ld reg8, reg8,并且您必须解码两组 3 位,每组一个 reg8。所以 110 和 111,你在 reg8 解码表中查找它们,其中 110 表示(hl),111 表示a。或者,您可以只进行一个巨大的死亡开关并将 0x77 直接解码为 ld (hl), a,但这在实现上的差异比任何深度或重要的差异更大。

指令完全指定了操作数是什么,所以这个“我怎么知道”的问题让我觉得有点傻——当你解码指令时,答案已经在你眼前了。

另请参阅:decoding z80 opcodes

【讨论】:

  • 我不知道操作码持有 :) 所以每条指令都是一个字节,包括操作数?
  • @ChristopherWirt 还有前缀,对于某些指令,您必须读取其他字节以获取立即参数或索引位移。与主操作码结合的前缀(如果有)将告诉您要读取多少额外字节以及它们的含义。例如,对于 21 和 2A,您读取两个额外字节并将某些内容加载到 hl,对于 21,它是那些立即字节,对于 2A,它是这些立即字节给定地址处 RAM 中的值(以及该地址之后的一个,因为显然是 16 位负载)。
  • 是的,我得到了这么多。太好了,这非常有帮助。谢谢!
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多