2012-04-13 3 views
2

Ich bin derzeit mit DCPU-16 Assembler herum fummeln (siehe http://0x10c.com/doc/dcpu-16.txt und http://jazzychad.net/dcpu.html).Warum gibt es eine führende 1 in der binären Darstellung von DCPU-16 Anweisungen

Es gibt eine Sache, die ich nicht verstehe in der Art, wie die Assembler-Anweisungen in Hex/Binär umgewandelt werden.

Als Beispiel nehmen einen Befehl wie

SET B, 0x0002 

, die den Wert des Registers B setzen soll, 2 (oder hex 0x0002 oder binär 0b000010) -Format

Instruction zur DCPU-16 in Dezimalzahlen

ist
bbbbbbaaaaaaoooo 

also 4 Bits für den Opcode am unteren Ende, 6 Bits für den ersten Wert, 6 Bits für den zweiten Wert ist.

Wenn die Anweisung von Hand verwandeln, das ist, wie ich es tun würde:

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

mit der kompletten Anweisung

0b0000100000010001 == 0x811 

aber der richtigen Wert für DCPU-16 ist sein enden

0b1000100000010001 == 0x8811 

das ist, eine führende 1 hinzugefügt wird - warum ist das?

Ich bin völlig neu zu Assembler und jede andere Art von hardcore Low-Level-Maschinenunterricht Sachen, also bitte bitte mit mir, wenn dies eine sehr dumme Frage ist.

Antwort

5

Nach den Spezifikationen,

 
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) 

Somit Literale 0x00-0x1f durch die Befehlswerte 0x20-0x3f spezifiziert sind - das heißt, das signifikanteste Bit (aus dem 6) festgelegt ist. Also würde das Literal 0x02 den Befehlswert 0x22 haben.

Der Befehlswert 0x02 bezieht sich auf die C-Register, also was Sie die zusammengesetzte Anweisung gedacht sein sollte, 0b0000100000010001 == 0x811 würde SET B, C die Anweisung tatsächlich sein.

+0

Oh, natürlich, ich verstehe es. Die CPU hätte keine Möglichkeit zu unterscheiden, ob das Register oder der Wert gemeint ist. Danke vielmals! –

+0

Mal sehen, ob ich es vollständig klasse - mit diesem Offset kann ich die literalen Dezimalwerte 0 bis 31 in den bbbbbb-Bitblock einer Anweisung schreiben - aber wenn ich z. B. Dezimal 40 in Register a setzen möchte, ist das ' SET B, 0x0028', dann wäre der Befehl 'bbbbbbaaaaaaooo'' oooo = '00001' für' SET', aaaaaa = '000001' für' B', bbbbbb = '011111' für" nächstes Wort (literal) "und dann '0000000000101000' (= 40) auf das nächste Wort? –

+1

@ManuelKiessling: Hört sich gut an. –

0

Die Textbeschreibung, zu der Sie verlinkt haben, sagt nichts darüber aus, wie Anweisungen zu ausführbarem Code zusammengefügt werden. Sie können sie jedoch über das Javascript auf der Emulatorseite, mit der Sie verlinkt haben, zurückentwickeln. Es scheint, dass es eine interne Funktion namens "pack" gibt, die die binären Anweisungen erstellt. Die Pack-Funktion tut dies:

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

, die iterativ für die geparste Eingabe aufgerufen wird. Ich würde empfehlen, den Verkäufer/Erfinder nach Montagedokumentation zu fragen.

Verwandte Themen