Man*_*ing 2 binary assembly hex dcpu-16
我目前正在摆弄DCPU-16汇编程序(参见http://0x10c.com/doc/dcpu-16.txt和http://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 - 为什么呢?
我对汇编程序和任何其他类型的硬核低级机器指令都很陌生,所以如果这是一个非常愚蠢的问题,请耐心等待.
根据规格,
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.
| 归档时间: |
|
| 查看次数: |
434 次 |
| 最近记录: |