到目前为止,我有一个相当简单的程序来开始我的仿真体验。我加载一条指令并确定有多少(如果有)操作数,然后我抓取这些操作数并使用它们。对于诸如跳转和推送之类的事情,在我到达寄存器之前它有点简单。我怎么知道操作数何时是寄存器?或者我如何判断它是否是地址处的值而不仅仅是地址(即当他们使用类似的东西时ld (hl),a
)
我对仿真和所有的东西都比较陌生,但我在组装方面有相当多的经验,即使是 z80 也是如此。
问题
我如何区分寄存器的含义与地址的含义或地址的取消引用之间的区别?
因为你解码指令。例如,在ld (hl), a
0x77 或 0b01110111 中,第一个 01 告诉您它是一个ld reg8, reg8
,并且您必须解码两组 3 位,每组一个 reg8。所以 110 和 111,你在 reg8 解码表中查找它们,其中 110 表示(hl)
111 表示a
。或者,您可以制作一个巨大的死亡开关并直接将 0x77 解码为ld (hl), a
,但这在实现上的差异比任何深度或显着的差异更大。
该指令完全指定了操作数是什么,所以这个“我怎么知道”的问题让我觉得有点傻——当你解码指令时,答案已经在你眼前了。
另请参阅:解码 z80 操作码