2

私は現在、DCPU-16アセンブラをいじっています(http://0x10c.com/doc/dcpu-16.txtおよびhttp://jazzychad.net/dcpu.htmlを参照)。

アセンブラ命令が16進数/バイナリに変換される方法で私が理解していないことが1つあります。

例として、次のような命令を取ります

SET B, 0x0002

これは、レジスタBの値を10進数の2(または16進数の0x0002または2進数の0b000010)に設定することになっています。

DCPU-16の命令フォーマットは

bbbbbbaaaaaaoooo

したがって、下端のオペコード用に4ビット、最初の値用に6ビット、2番目の値用に6ビットです。

命令を手動で変換する場合、これが私が行う方法です。

SET == 0x1    == 0b0001
  B == 0x01   == 0b000001
       0x0002 == 0b000010

完全な命令で終わる

0b0000100000010001 == 0x811

ただし、DCPU-16の正しい値は次のとおりです。

0b1000100000010001 == 0x8811

つまり、先頭に1が追加されます-それはなぜですか?

私はアセンブラーやその他のハードコアな低レベルのマシン命令にまったく慣れていないので、これが非常に愚かな質問である場合はご容赦ください。

4

2 に答える 2

5

スペックによると、

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

于 2012-04-13T16:53:43.250 に答える
0

リンクしたテキストの説明には、命令が実行可能コードにアセンブルされる方法については何も書かれていませんが、リンクしたエミュレーターページのJavascriptからリバースエンジニアリングすることができます。バイナリ命令を作成する「pack」という内部関数があるようです。pack関数はこれを行います:

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

これは、解析された入力に対して繰り返し呼び出されます。アセンブリのドキュメントについてベンダー/発明者に尋ねることをお勧めします。

于 2012-04-13T16:11:23.740 に答える