{"id":5970,"date":"2014-03-01T08:08:09","date_gmt":"2014-03-01T07:08:09","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=5970"},"modified":"2014-03-01T08:08:09","modified_gmt":"2014-03-01T07:08:09","slug":"core-war-krieg-der-kerne","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2014\/03\/core-war-krieg-der-kerne.htm","title":{"rendered":"Core War &#8211; Krieg der Kerne"},"content":{"rendered":"<div style='text-align:right;'><small>(<a href='https:\/\/www.herr-rau.de\/wordpress\/2014\/03\/core-war-krieg-der-kerne.htm#comments'>5 Kommentare.<\/a>)<\/small> <\/div><p>Hat der Kollege doch neulich seiner 12. Klass <em>Core War<\/em> vorgestellt. Gute Idee. Das hatte ich mir schon zu Studienzeiten mal angeschaut, aber dann doch zu wenig begriffen. Inzwischen geht es etwas besser. Wer eh wei\u00df, was Assembler ist, kann die Punkte 2 bis 4 \u00fcberspringen.<\/p>\n<p><strong>1. Core War<\/strong><\/p>\n<p>Seit 30 Jahren gibt es das Spiel Core War. Dabei schreiben zwei Leute jeweils ein Programm in einer assemblerartigen Sprache. Zu jedem Programm geh\u00f6rt mehr oder weniger eine Endlosschleife, so dass das Programm immer weiter l\u00e4uft und nie aufh\u00f6rt.<br \/>\nDie beiden Programme werden in denselben Arbeitsspeicher geladen. Danach wird jeweils abwechselnd eine Zeile vom einen, dann vom anderen Programm ausgef\u00fchrt, und immer so weiter. Irgendwann \u00fcberschreibt eines der Programme das andere, so dass jenes dann nicht mehr lauff\u00e4hig ist &#8211; und damit hat das Programm, das \u00fcbrig bleibt, gewonnen. Denn das Ziel ist, am Schluss das einzige Programm zu haben, das noch in lauff\u00e4higem Zustand ist. Daher auch der martialische Name Core War.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/corewar_00.gif\" alt=\"corewar_00\" width=\"558\" height=\"418\" class=\"alignnone size-full wp-image-5973\" \/><\/p>\n<p><strong>2. Prozessor und Assembler<\/strong><\/p>\n<p>In der 12. Klasse lernen Sch\u00fcler, wie ein Prozessor funktioniert und mit dem Arbeitsspeicher des Computers zusammenarbeitet. Der Prozessor ist das Teil am Rechner, was rechnet und das Rechnen organisiert. Letztlich wird jedes Computerprogramm, das auf einem Rechner l\u00e4uft &#8211; das Betriebssystem eingeschlossen &#8211; fr\u00fcher oder sp\u00e4ter in die eigene Programmiersprache des Prozessors \u00fcbersetzt und dann von diesem ausgef\u00fchrt. <\/p>\n<p>Diese eigene Programmiersprache, oder jedenfalls die menschenfreundlich lesbare Version davon, hei\u00dft <em>Assembler<\/em>. So gut lesbar wie h\u00f6here Programmiersprachen ist Assembler allerdings bei weitem nicht, die Befehle sehen am Anfang ziemlich kryptisch aus. Trotzdem macht Sch\u00fclern das Assembler-Programmieren meistens Spa\u00df, da man dabei sehr kleinschrittig vorgeht und jeder Schritt klar ist und wenig Abstraktion erfordert &#8211; so dass eben selbst ein Prozessor ihn ausf\u00fchren kann.<\/p>\n<p><strong>3. Der Arbeitsspeicher<\/strong><\/p>\n<p>Um das Spiel verstehen zu k\u00f6nnen, muss man allerdings erst den Arbeitsspeicher eines Computers verstehen. Der ist das Ged\u00e4chtnis des Computers, und das wird immer dann gel\u00f6scht, wenn man den Rechner ausschaltet. (Beim Neustart m\u00fcssen die Ged\u00e4chtnisinhalte erst wieder von der Festplatte oder anderen Speichern geladen werden.) Man kann ihn sich vorstellen wie ein Tabellenkalkulationsdokument voller Zahlen:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/corewar_01.png\" alt=\"corewar_01\" width=\"514\" height=\"107\" class=\"alignnone size-full wp-image-5971\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/corewar_01.png 514w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/corewar_01-150x31.png 150w\" sizes=\"auto, (max-width: 514px) 100vw, 514px\" \/><\/p>\n<p>Es gibt Zellen, die alle gleich gro\u00df sind und Platz jeweils f\u00fcr eine Zahl einer bestimmten Gr\u00f6\u00dfe haben &#8211; sagen wir von 0 bis 255. (F\u00fcr gr\u00f6\u00dfere Zahlen muss man die Information dann auf mehrere Zellen verteilen.)<br \/>\nEin Unterschied ist der, dass so ein Arbeitsspeicher nicht zweidimensional angeordnet ist wie Schiffeversenken oder eben Tabellenkalkulation, sondern eine lange Reihe von Zellen ist, alle hintereinander und alle durchnummeriert. Grafisch abgebildet wird er meist trotzdem in zweidimensionaler Form, weil er sich so einfach leichter darstellen l\u00e4sst. Aber die Zellen werden eben nicht in der Form &#8222;A1&#8220; (f\u00fcr die Zelle links oben) und &#8222;J4&#8220; (f\u00fcr eine Zelle weiter rechts und weiter unten) bezeichnet, sondern sie haben fortlaufende Nummern: Nummer 0 ist die erste Zelle, und Nummer 4294967295 ist die letzte Zelle, wenn man von 2<sup>32<\/sup> Zellen im Arbeitsspeicher ausgeht. (Das w\u00e4ren etwas mehr als 4 Gigabyte. Wie gro\u00df der Arbeitsspeicher tats\u00e4chlich ist, also wie viele Zellen es gibt, h\u00e4ngt nat\u00fcrlich vom Rechner ab.)<\/p>\n<p>Eigentlich &#8211; zumindest auf irgendeiner Ebene der Eigentlichheit &#8211; stehen die Zahlen dort im Bin\u00e4rsystem, also etwa &#8222;10111001&#8220;. Im Dezimalsystem entspricht das der Zahl &#8222;185&#8220;. F\u00fcr uns spielt das keine gro\u00dfe Rolle, aber das Beispiel oben sieht dann so aus:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/corewar_02.png\" alt=\"corewar_02\" width=\"672\" height=\"81\" class=\"alignnone size-full wp-image-5974\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/corewar_02.png 672w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/corewar_02-150x18.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/corewar_02-550x66.png 550w\" sizes=\"auto, (max-width: 672px) 100vw, 672px\" \/><\/p>\n<p><strong>4. Befehle und Daten<\/strong><\/p>\n<p>Bei den \u00fcblichen Rechnern liegen alle Informationen im gleichen Speicher, das Programm und die Daten. In einer Assemblersprache k\u00f6nnte es zum Beispiel eine Befehlszeile ADDIERE 45 15 geben &#8211; das soll hei\u00dfen, addiere die Zahl 45 zur Zahl 15 und merke dir das Ergebnis im Kurzzeitged\u00e4chtnis. Diese Elemente, also der Befehle ADDIERE und die beiden Zahlen, liegen hintereinander im Arbeitsspeicher. ADDIERE sieht dort aus wie eine ganz normale Zahl, und <em>ist<\/em> auch eine ganz normale Zahl, da ja \u00fcberhaupt nur Zahlen gespeichert werden k\u00f6nnen. Aber wenn der Prozessor angewiesen wird, diese Zelle als eine Zelle mit einem Befehl zu interpretieren, dann funktioniert die Zahl, die f\u00fcr ADDIERE steht, als Auftrag, dass er genau das mit den n\u00e4chsten beiden Zahlen machen soll. <\/p>\n<p>Viel mehr braucht man f\u00fcr Core War nicht zu wissen.<\/p>\n<p><strong>5. Der kleinste Core Warrior<\/strong><\/p>\n<p>Das kleinste funktionierende Core-War-Programm besteht nur aus einer Zeile:<\/p>\n<pre>MOV 0, 1<\/pre>\n<p>Wenn diese Zeile ausgef\u00fchrt wird, hei\u00dft das: Kopiere (&#8222;move&#8220;) die Zeile, die von der aktuellen 0 entfernt ist, in die Zeile, die von der aktuellen 1 entfernt ist. Und mach weiter bei der n\u00e4chsten Zeile &#8211; das muss man nicht hinschreiben, das passiert automatisch, wenn man nichts anderes anweist. (Fu\u00dfnote f\u00fcr die, die andere Assemblersprachen kennen: Ja, in Redcode stehen Befehle und Argumente in einer gemeinsamen Speicherzelle.)<\/p>\n<p>Am Anfang sieht der Arbeitsspeicher so aus, als N\u00e4chstes wird der Befehl in Adresse 000 ausgef\u00fchrt:<\/p>\n<pre><em>Adresse 000:<\/em> MOV 0, 1\r\n<em>Adresse 001:<\/em> (irgendwas)\r\n<em>Adresse 002:<\/em> (irgendwas)<\/pre>\n<p>Danach sieht der Arbeitsspeicher so aus, als N\u00e4chstes wird der Befehl in Adresse 001 ausgef\u00fchrt:<\/p>\n<pre><em>Adresse 000:<\/em> MOV 0, 1\r\n<em>Adresse 001:<\/em> MOV 0, 1\r\n<em>Adresse 002:<\/em> (irgendwas)<\/pre>\n<p>Danach sieht der Arbeitsspeicher so aus, als N\u00e4chstes wird der Befehl in Adresse 002 ausgef\u00fchrt:<\/p>\n<pre><em>Adresse 000:<\/em> MOV 0, 1\r\n<em>Adresse 001:<\/em> MOV 0, 1\r\n<em>Adresse 002:<\/em> MOV 0, 1<\/pre>\n<p>Und so weiter. Das Programm l\u00e4uft ewig, solange es nicht gest\u00f6rt wird.<\/p>\n<p><strong>6. Adressierungsarten und ein weiterer K\u00e4mpfer<\/strong><\/p>\n<p>An diesem Beispiel sieht man die unterschiedlichen Adressierungsarten, die es gibt:<\/p>\n<pre><em>Adresse 001:<\/em> MOV  +3,  @+4\r\n<em>Adresse 002:<\/em> ADD  #2,  +3\r\n<em>Adresse 003:<\/em> JMP  -2\r\n<em>Adresse 004:<\/em> DAT #1234\r\n<em>Adresse 005:<\/em> DAT #10<\/pre>\n<p>Die erste Zeile sagt, dass die dritte Zeile (von der aktuellen aus gez\u00e4hlt, also Adresse 004) kopiert werden soll an die Adresse, die in der vierten Zeile steht (von der aktuellen aus gez\u00e4hlt, also in diesem Fall Adresse 005, wo #10 steht, also ist das Ziel der Kopieraktion die Adresse 010).<br \/>\nDie zweite Zeile sorgt daf\u00fcr, dass die Zahl 2 zum Wert in der Adresse 3 Zeilen weiter addiert wird. Unter Adresse 005 steht danach also #12.<br \/>\nDie dritte Zeile sorgt daf\u00fcr, dass der Befehlsz\u00e4hler danach nicht automatisch wie sonst auf die n\u00e4chste Zeile zeigt, sondern auf die Zeile 2 Zeilen vor der aktuellen (in diesem Fall also Adresse 001, wo wir wieder von vorne beginnen, nur dass sich das in Adresse 005 stehende Kopierziel ge\u00e4ndert hat).<\/p>\n<p>Den Unterschied zwischen +4, #4 und @+4 erkennt man vielleicht so:<\/p>\n<ul>\n<li>JMP #4 hei\u00dft: Springe zu Adresse 4 &#8211; diese absolute Adressierung funktioniert in Redcode nicht. #4 bedeutet: Die Zahl 4 selbst, unmittelbar.<\/li>\n<li>JMP +4 hei\u00dft: Springe zur Adresse 4 Zeilen weiter. Das hei\u00dft relative Adressierung (wird in Redcode auch &#8222;direkte Adressierung&#8220; genannt).<\/li>\n<li>JMP @+4 hei\u00dft: Springe zu der Adresse (relativ betrachtet), die in der Adresse 4 Zeilen weiter steht. Das hei\u00dft indirekte Adressierung.<\/li>\n<\/ul>\n<p>Diese Unterschiede gibt es auch bei richtigen Assemblersprachen.<\/p>\n<p><strong>7. Was ich sonst noch wei\u00df<\/strong><\/p>\n<p>Nicht mehr viel. Aber man kann das ja mal Sch\u00fclern zeigen. Richtig einsteigen wird man kaum, aber die Sch\u00fcler sehen wenigstens, dass sie mit ihrem Assemblerwissen etwas anfangen k\u00f6nnen.<br \/>\nHier ist <a href=\"https:\/\/de.wikipedia.org\/wiki\/Core_War\">die Wikipedia-Seite dazu<\/a>, auf der auch ein <a href=\"http:\/\/www.mynetcologne.de\/~nc-zapfsa\/\">Link zu einem ausf\u00fchrlichen deutschen Handbuch<\/a> steht. Dort wird die Assemblersprache Redcode vorgestellt, in der Core-War-Programme geschrieben sind, es gibt au\u00dferdem Beispiele f\u00fcr verschiedene Angriffs- und Verteidigungstechniken. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>(5 Kommentare.) Hat der Kollege doch neulich seiner 12. Klass Core War vorgestellt. Gute Idee. Das hatte ich mir schon zu Studienzeiten mal angeschaut, aber dann doch zu wenig begriffen. Inzwischen geht es etwas besser. Wer eh wei\u00df, was Assembler ist, kann die Punkte 2 bis 4 \u00fcberspringen. 1. Core War Seit 30 Jahren gibt [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":5971,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[227],"class_list":["post-5970","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","tag-informatik"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/corewar_01.png","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/5970","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=5970"}],"version-history":[{"count":0,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/5970\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/5971"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=5970"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=5970"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=5970"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}