2012-04-13 4 views
2

現在、DCPU-16アセンブラを使用しています(http://0x10c.com/doc/dcpu-16.txtおよびhttp://jazzychad.net/dcpu.htmlを参照)。DCPU-16命令のバイナリ表現に先行する1がある理由

アセンブラの命令が16進/ 2進に変換される方法がわかりません。 DCPU-16のための例として

、2(又は六角0×0002またはバイナリ0b000010)を小数にレジスタBの値を設定することになっている

SET B, 0x0002 

ような指示を取る

命令フォーマット

したがって、下端のオペコードは4ビット、第1の値は6ビット、第2の値は6ビットです。

手で指示を変換すると、これは私はそれを行うだろうかです:

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

完全な命令が

0b0000100000010001 == 0x811 

ことで終わるが、DCPU-16の正しい値が

です
0b1000100000010001 == 0x8811 

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

私はアセンブラや他のハードコアの低レベルの機械教材にはまったく新しいので、これは非常にばかげた質問であれば私にご負担ください。

答えて

5

、したがって、リテラル0x00-0x1fが命令値0x20-0x3fによって指定され

 
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) 

- つまり、(6のうち)最上位ビットがセットされています。したがって、リテラル0x02は命令値0x22を持ちます。

指令値0x02は、あなたが組み立てられた命令があるべき思っので、C-登録を指し0b0000100000010001 == 0x811、実際に命令SET B, Cだろう。

+0

もちろん、私はそれを手に入れます。 CPUは、レジスタまたは値が意味されるかどうかを区別する方法がありません。どうもありがとう! –

+0

私は完全にgrokかどうか見てみましょう - このオフセットを使用して、私は命令のbbbbbbビットブロックにリテラル小数点値0を書くことができます - しかし、もし私が10進数40をレジスタaに入れたいなら、 SET B、0x0028'の場合、命令 'bbbbbbaaaaaaoooo'は、 'SET'の場合はoooo =' 00001'、 'B'の場合はaaaaaa =' 000001'、次の単語(リテラル)の場合はbbbbbb = '011111'、次の単語に '0000000000101000'(= 40)? –

+1

@ManuelKiessling:右のように聞こえます。 –

0

あなたがリンクしているテキスト記述は、命令が実行可能コードにどのように組み立てられているかについては言及していませんが、あなたがリンクしたエミュレータページのJavascriptからリバースエンジニアリングすることができます。バイナリ命令を作成する "pack"という内部関数があるようです。 pack関数は、これを行います。

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

これは、解析された入力に対して繰り返し呼び出されます。私はベンダーや発明者にアセンブリの文書化について尋ねることをお勧めします。仕様によれば