2 Stimmen

Hilfe zum Verständnis von RedCode

Ich versuche, Redcode zu lernen, weil es Spaß macht, einen Bot zu erstellen.

Einführung

Für diejenigen, die nicht wissen, was redcode ist, hier eine kurze Erklärung. Es handelt sich um eine ASM-ähnliche Sprache, die aber viel einfacher und weniger komplex ist. Sie wird verwendet, um kleine Programme zu schreiben, die andere Programme im virtuellen Speicher herunterfahren müssen. (Weitere Informationen finden Sie hier: http://vyznev.net/corewar/guide.html )

Hier ist ein Stück Code:

;redcode
;name Mice
;author Chip Wendell
;strategy paper (replicator)
;history Winner of the 1986 ICWS tournament
Top dat #0, #0
Start   mov #12,    Top
Loop    mov @Top,   <Target
    djn Loop,   Top
    spl @Target,0
Spacer  equ 653
    add #Spacer,Target
    jmz Start,  Top
Target  dat #0, #833
    end Start

Problem

Die grundlegende Strategie besteht darin, sich selbst an einen anderen Ort zu replizieren und den Prozess zu verzweigen. Was ich nicht verstehe, ist diese Regel:

Loop    mov @Top,   <Target

Ich verstehe die Bedeutung dieser Zeile. Sie besagt, dass das B-Feld des Ziels auf die Linie verschoben werden soll, auf die das B-Feld des oberen Bereichs zeigt, und dass der Wert des B-Felds des Ziels verringert werden soll.

Wenn die Schleife zum ersten Mal ausgeführt wird, lautet die erste Zeile:

Top dat #0, #12

Soweit ich das verstehe, bedeutet die Zeile mit Loop: Verschiebe die Anweisung 12 Zeilen nach vorne (gefüllt mit dat #0, #0) in Zeile 833.

Wenn dieser Code jedoch ausgeführt wird, wird die Codezeile in Zeile 839 eingefügt.

Versteht jemand, was hier wirklich passiert?

3voto

Pesto Punkte 23518

Okay, das hat ein bisschen gedauert, aber hier ist die Antwort:

Die erste Anweisung macht, wie Sie richtig vermuten, Top zu DAT #0, #12. Das ist einfach, aber die nächste Anweisung ist komplizierter. Zuerst wird der B-Wert von Target dekrementiert (und damit auf 832 gesetzt). Dann kopiert sie die Anweisung in Top an die Stelle, die 832 Zeilen weiter vorne liegt relativ zum Ziel . Das ist der Schlüssel: Der indirekte Adressierungsmodus bedeutet, dass das Ziel relativ zu dem für den Offset gelesenen B-Wert ist. Sehen Sie sich nun den Code nach der Kompilierung an, mit vorangestellten Zeilennummern:

0000 Top    DAT.F  #0        #0       
0001 Start  MOV.AB #12       $-1      
0002 Loop   MOV.I  @-2       <5       
0003        DJN.B  $-1       $-3      
0004        SPL.B  @3        $0       
0005        ADD.AB #653      $2       
0006        JMZ.B  $-5       $-6      
0007 Target DAT.F  #0        #833  

Wie Sie sehen können, befindet sich das Ziel in Zeile 7, so dass 832 Zeilen vor dem Ziel die Zeile 839 ist.

Ich hoffe, das klärt die Sache für Sie auf.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X