2

我目前正在摆弄 DCPU-16 汇编器(参见http://0x10c.com/doc/dcpu-16.txthttp://jazzychad.net/dcpu.html)。

在将汇编程序指令转换为十六进制/二进制的方式中,我不明白一件事。

例如,采取类似的指令

SET B, 0x0002

应该将寄存器 B 的值设置为十进制 2(或十六进制 0x0002 或二进制 0b000010)

DCPU-16 的指令格式为

bbbbbbaaaaaaoooo

因此,低端的操作码占 4 位,第一个值占 6 位,第二个值占 6 位。

手动转换指令时,我会这样做:

SET == 0x1    == 0b0001
  B == 0x01   == 0b000001
       0x0002 == 0b000010

以完整的指令结束

0b0000100000010001 == 0x811

但 DCPU-16 的正确值是

0b1000100000010001 == 0x8811

也就是说,添加了前导 1 - 为什么?

我对汇编程序和任何其他类型的硬核低级机器指令完全陌生,所以如果这是一个非常愚蠢的问题,请多多包涵。

4

2 回答 2

5

根据规格,

值:(6 位)
    0x00-0x07:寄存器(A、B、C、X、Y、Z、I 或 J,按此顺序)
    ...
    0x20-0x3f:字面值 0x00-0x1f(字面量)

因此,文字0x00-0x1f由指令值指定0x20-0x3f——也就是说,设置了最高有效位(6 个中的位)。所以文字0x02会有指令值0x22

指令值0x02是指 C 寄存器,因此您认为汇编指令应该是 ,0b0000100000010001 == 0x811实际上是指令SET B, C

于 2012-04-13T16:53:43.250 回答
0

您链接到的文本描述没有说明如何将指令组装成可执行代码,但您可以从链接到的模拟器页面上的 Javascript 对其进行逆向工程。似乎有一个名为“pack”的内部函数可以创建二进制指令。pack 函数执行此操作:

words[0] += value << (4 + operand * 6);

对于解析的输入,它被迭代调用。我建议向供应商/发明人询问组装文件。

于 2012-04-13T16:11:23.740 回答