我目前正在摆弄DCPU-16汇编程序(请参阅http://0x10c.com/doc/dcpu-16.txt和http://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 - 为什么会这样?
我对汇编程序和任何其他类型的硬核低级机器指令都很陌生,所以如果这是一个非常愚蠢的问题,请耐心等待。
答案 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);
为解析的输入迭代调用。我建议询问供应商/发明人关于装配文档的内容。