2012-04-05 11 views
7

Gemäß der DCPU specification ist die einzige Zeit, die eine SET Anweisung fehlschlägt, wenn der a Wert ein Literal ist.Können Sie auf [PC] schreiben?

So würde die folgende Arbeit?

SET [PC],0x1000 

Eine nützlichere Version wäre eine von PC ausgeglichen werden Einstellung, so dass eine ziemlich seltsame Endlosschleife wäre:

SET [PC+0x2],0x89C3 ; = SUB PC,0x2 
+0

Was ist "DCPU-Spezifikation"? Bitte geben Sie einen Link an, wenn Sie einen haben. –

+1

@AaronDigulla, http://0x10c.com/doc/dcpu-16.txt – Matt

+1

+1 Oh, wie ich imaginäre Computing lieben :) –

Antwort

7

Wahrscheinlich (= Ich denke, es sollte funktionieren, aber ich habe nicht versucht) .

Dies wird als "selbstmodifizierender" Code bezeichnet und war wegen der a) begrenzten RAM und b) begrenzten Codegröße ziemlich häufig in der 8bit-Ära. Code wie dieser ist sehr mächtig, aber fehleranfällig. Wenn Ihre Code-Basis wächst, kann dies schnell zu einem Wartungs-Albtraum werden.

Famous Anwendungsfälle:

  1. Windows 95 verwendeten Codes wie diese Grafiken auf dem Stapel Rendering-Code zu bauen.
  2. Viren und Trojaner nutzen diese als Angriffsvektor (Schreib Code auf dem Stack oder manipulieren Absenderadressen ein JMP simluate) auf dem C64
  3. Simulieren switch-Anweisungen
+0

Der einzige Unterschied, dass Ich kann sehen, dass Sie mit DCPU keinen Code auf dem Stack ausführen können, da 'PC'-Werte sich in einem völlig anderen Speicherraum als der Stack/RAM befinden, daher kann 'SET PC, ###' nicht zum Springen verwendet werden der Stapel. – Matt

+0

@Mat - Sie können Code auf dem Stapel mit DCPU ausführen. Werfen Sie einen Blick auf den unteren Teil der DCPU-Spezifikation. Der Speicherauszug dieses Codes. – flumpb

+0

@kisplit, Sie können Code auf den Stapel legen, aber wie springen Sie dazu? Dieser Dump ist nur der ausführbare Code. – Matt

4

Es für [PC] kein Wert ist, Ich nehme an, Sie müssen es auf runde Art tun, indem Sie PC in etwas speichern, das Sie als Zeiger verwenden können (Registrierung oder Speicher).

 
     SET A , PC 
     SET [A+3], 0x8dc3 ; SUB PC, 3 (if A can't be changed from outside SUB PC,2 works too.) 
+0

Dieser Code würde nicht funktionieren, da der Codeabschnitt die gleichen Nummern wie der RAM/Stack verwendet."A" nach dieser Anweisung würde zu einer Zahl ausgewertet, und dann würde sich [[A + 3]] auf diese Position im Speicher und nicht im Code-Abschnitt beziehen. – Matt

+1

@Mat - Es gibt keine separaten Abschnitte. Sie können selbst modifizierenden Code mit DCPU schreiben. – flumpb