为什么在DCPU-16指令的二进制表示中存在前导1

时间:2012-04-13 15:39:40

标签: assembly binary hex dcpu-16

我目前正在摆弄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 - 为什么会这样?

我对汇编程序和任何其他类型的硬核低级机器指令都很陌生,所以如果这是一个非常愚蠢的问题,请耐心等待。

2 个答案:

答案 0 :(得分:5)

根据规格,

Values: (6 bits)
    0x00-0x07: register (A, B, C, X, Y, Z, I or J, in that order)
    ...
    0x20-0x3f: literal value 0x00-0x1f (literal)

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

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

答案 1 :(得分:0)

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

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

为解析的输入迭代调用。我建议询问供应商/发明人关于装配文档的内容。