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

Man*_*ing 2 binary assembly hex dcpu-16

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

在汇编程序指令转换为十六进制/二进制的方式中,有一点我不明白.

作为一个例子,采取像这样的指令

SET B, 0x0002
Run Code Online (Sandbox Code Playgroud)

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

DCPU-16的指令格式是

bbbbbbaaaaaaoooo
Run Code Online (Sandbox Code Playgroud)

因此,4位用于下端的操作码,6位用于第一个值,6位用于第二个值.

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

SET == 0x1    == 0b0001
  B == 0x01   == 0b000001
       0x0002 == 0b000010
Run Code Online (Sandbox Code Playgroud)

以完整的指令结束

0b0000100000010001 == 0x811
Run Code Online (Sandbox Code Playgroud)

但DCPU-16的正确值是

0b1000100000010001 == 0x8811
Run Code Online (Sandbox Code Playgroud)

也就是说,增加了领先1 - 为什么呢?

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

Blu*_*eft 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.