无法在机器指令中编码32位二进制操作码

时间:2014-01-16 20:41:51

标签: binary binary-data opcode machine-code addressing-mode

我一直在尝试为Motorola 68000格式化二进制操作码,但我一直发现无法对目标存储器地址,指令指定和寻址模式/大小以及要复制到地址总线的数据值进行编码内存映射I / O.

对于Sega Genesis的视频显示处理器,我试图写入控制端口,该端口是Genesis内存映射中C00004的内存映射。

C0004是二进制的1100 0000 0000 0000 0000 0100,或三个字节。我写的值是87,VDP在VDP寄存器#7中识别为8787。我遇到的问题是弄清楚如何编码32位数据,例如指令前缀指定move.b,值87,即#$87,目标存储器地址C00004,用于MMIO在到VDP的路上重新路由到正确的VDP端口。

总之它看起来像这样:

move.b  #$87, $00C00004,

松散地转换为而不是四个,但是四个字节和一个半字节(准确地说是36位!)

0001 1000 0111 1100 0000 0000 0000 0000 0100

由于Motorola 68000在处理microcode时只会解析32位,如果没有足够的空间(并且在同一条指令中),如何对所需信息进行编码?

Perhaps I'm understanding this incorrectly?

我知道这超出了大多数程序员所预期的水平,但我希望周围的人可以为我解决这个问题并解释这种编码方案是如何工作的。

1 个答案:

答案 0 :(得分:0)

您的指示move.b #$87, $$00C00004应编码为

0001111001111100 0000000010000111 00000000110000000000000000000100

(或类似;我不确定操作数的顺序)。

第一个16位字可以这样分解:

  • 前四位表示这是move.b指令。
  • 接下来的六位表示目标寻址模式是绝对的32位地址。
  • 最后六位表示源操作数是立即的。

之后是带有操作数的指令扩展字。第一个是立即数据的16位,最后32位是地址。 (可能反过来。)

有关详细信息,请参阅http://www.freescale.com/files/archives/doc/ref_manual/M68000PRM.pdf