【问题标题】:Why is there a leading 1 in the binary representation of DCPU-16 instructions为什么DCPU-16指令的二进制表示中有前导1
【发布时间】:2012-04-26 00:02:28
【问题描述】:

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

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

【问题讨论】:

    标签: assembly binary hex dcpu-16


    【解决方案1】:

    根据规格,

    值:(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

    【讨论】:

    • 哦,当然,我明白了。 CPU 将无法区分是寄存器还是值。非常感谢!
    • 让我们看看我是否完全理解它 - 使用这个偏移量,我可以将文字十进制值 0 到 31 写入指令的 bbbbbb 位块 - 但是如果我想输入十进制 40进入寄存器a,即SET B, 0x0028,那么指令bbbbbbaaaaaaoooo将是oooo = 00001 for SET,aaaaaa = 000001 for B,bbbbbb = 011111 for "next word (literal) ",然后在下一个单词上使用 0000000000101000 (= 40)?
    【解决方案2】:

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

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

    为解析的输入迭代调用。我建议向供应商/发明人询问组装文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2020-08-02
      相关资源
      最近更新 更多