7,7,7,7,7,7,7,7- Lass das!

Geplanter Beginn: 18 Uhr
Tatsächlicher Beginn: 23 Uhr
Delay: 5 Stunden

Die vierte Session fionalerntprogrammieren zog sich etwas hin. Genau genommen dauerte es 12 Stunden, bis Erlehmann und Plom wieder meine Wohnung verließen. Aber dem ging ja auch eine Session plomlerntkochen voraus. Wir mussten solche Probleme behandeln wie

  • Was soll dieses Gemüse-wiegen, wie geht das und wie bescheiße ich dabei möglichst effizient?
  • Warum heißt das Zutschini und nicht Gurke?
  • Wo ist das Huhn in meinem Essen? (Kategorienfehler!)
  • Was mache ich, wenn mich Öl aus meinem Topf heraus anspritzt? Deeskalieren oder weitermachen?

Am Ende hatten wir auch noch hohen Besuch von den Schrammhardts da, die uns in heikle Gespräche über Magic und Feminismus verwickelten. Wir fühlten uns ordentlich in die Ecke gedrängt und werden sie sicher wählen.

Als sie gingen, um 23 Uhr, fingen wir an, Dinge an meinem Computer zu machen. ZB. diesen nervigen Piepton ausschalten, der mir immer durch Mark und Bein fährt, wenn ich zu oft Backspace drücke. Ich traute mich deswegen kaum noch laut Musik zu hören, aus Angst, dass dieser furchtbare Ton in derselben Lautstärke mich wieder so erschrecken könnte. Das hat mich zwar praktischerweise immer wieder daran erinnert, dass ich gerade im IRC lauere statt zu lernen, aber mit

modprobe -r pcspk

entfernten wir dann trotzdem den Ton. Weil wir es können.

In Kapitel Drei haben wir ja unsere ersten Programme „exit“ und „maximum“ geschrieben. Zur Erinnerung: Exit kann gar nichts, Maximum kann mir den höchsten Wert einer Zahlenreihe ausgeben. Am Ende des Kapitels stehen ein paar Fragen, die immer alle meine Notizen als wertlos auffliegen lassen.

—————————————das wird jetzt so ne super langweilige Erklärung, wie das Programm funktioniert, also skip das doch einfach oder so————————————–

Zwischen der vorletzten und letzten Session versuchte ich z.B. aus „Maximum“ ein „Minimum“-Programm zu machen. Doof weil dafür muss ich ja verstehen, wie das Programm überhaupt funktioniert. Das erfoderte ziemlich viel Willpower, um sich da durchzulesen. Aber so schwer war das gar nicht. Hier:

Das ist ein Teil des Programmes:

start_loop:
cmpl $0, %eax
je loop_exit
incl %edi
movl data_items(,%edi,4), %eax
cmpl %ebx, %eax
jle start_loop

movl %eax, %ebx
jmp start_loop

Das ist die Loop, die Schleife, durch die jeder einzelne Wert meiner Zahlenreihe einmal durch muss. Jeder Wert wird nacheinander als Erstes in das Register (ein temporärer Speicherort) %eax geladen bzw. kopiert. Das Ende meiner Zahlenreihe ist eine Null. Wenn Also die Zahl in %eax einer Null gleicht, was mit cmpl geprüft wird, hat der ganze Spaß ein Ende und das Programm steigt aus der Schleife aus. Wenn das nicht so ist, macht es halt weiter.
Das ist jetzt wie immer eigentlich alles gar nicht so wichtig, auf jeden Fall wird die größte Zahl immer in %ebx abgelegt. Also wird verglichen, ob die aktuell behandelte Zahl in %eax größer ist als die bisher größte in %ebx. Danach steht dort jle. Das steht für „Jump if the second value was less than or equal to the first value“. Wenn die aktuelle Zahl kleiner ist, sagt das Programm „ok, scheiße, dann nochmal ganz von Anfang der Schleife, mit der nächsten Zahl“. Wenn sie aber größer ist, geht es weiter im Text und die Zahl muss natürlich nach %ebx wandern, weil wir dort ja die Größte Zahl speichern. Also setzt sich die größte Zahl natürlich bei jedem cmpl durch, sobald sie in das %ebx-Register geladen ist.
Dass wir sie in %ebx speichern heißt auch, dass wir später auf sie zugreifen können, wenn wir unsere „echo $?“ -Nummer abziehen. Das adressiert nämlich die Zahl, die in %ebx steht. Ohwowohwow!
Und der springende Punkt ist eben, dass ich ein paar Stunden gebraucht habe, um zu checken, dass ich „jle“ in „jge“ (Jump if the second value was greater than or equal to the first value) umschreiben muss, damit am Ende die kleinste Zahl in %ebx steht. Das bedeutet, dass das Programm wieder von vorne anfängt, wenn der aktuell betrachtete Wert größer ist als der zu vergleichende Wert in %ebx (Der am Anfang übrigens Null ist). Und wenn er kleiner ist, geht da Programm weiter und kopiert diesen kleineren Wert nach %ebx, wodurch sich am Ende der kleinste Wert durchgesetzt haben wird. Das wäre natürlich die Null, die ganz am Ende steht.

Ich begann so langsam zu verstehen, dass Menschen, die beruflich programmieren wohl vor allem dafür entschädigt werden, dass sie sich ab und zu sehr lange und sehr stark ärgern müssen.

Die nächste Aufgabe war „Modify the maximum program to use an ending address rather than the number 0 to know when to stop.“
Wir schrieben ziemlich viel Bullshit in den Code rein, um das zu erzielen. Ich kann mich überhaupt nicht mehr daran erinnern, was wir genau machten, ich war sowieso ein bisschen frustriert, weil ich wirklich nicht drauf kam, wie ich das machen soll. Auch wenn wir tatsächlich ein bisschen zusammen daran arbeiteten. Ich warf ab und zu ein „So ein Quatsch“ ein, was ja in 90% der Fälle stimmt. Was Plom schrieb kam mir auch wirklich ein bisschen bescheuert vor (er verzehnfachte ungefähr die Länge des Programms), aber es funktionierte! Die Lösung, die ich dann googlete war natürlich etwas eleganter, aber trotzdem verstand ich dadurch etwas besser, was es mit der Lösungsfindung beim Programmieren auf sich hat. Der Einfachheit halber verzichte ich erstmal auf eine Clean Coding Ethik und arbeite…lösungsorientiert.

Und vor allem muss ich mich daran gewöhnen, Dinge 9000 Mal ausprobieren zu müssen und Fehler zu machen… Denn Programmieren lernen heißt auch manchmal einfach Versagen lernen.

Die letzte Aufgabe, die wir zusammen bewältigen wollten, war natürlich ein „Hallo Welt“-Programm zu schreiben. Das lag Plom sehr am Herzen. Und ja, seit ich mich mit Leuten übers Programmieren austausche hör ich auch regelmäßig „Na? Haha. Hast du schon „Hallo Welt“ programmiert?“. Und ich dann immer so „Nein, haha, höhö.“ Aber ab jetzt antworte ich darauf: „Ja. In Assembler„.
Und Gespräche übers Programmieren werden nie wieder dieselben sein!
Für das Programm „write“ musste ich einen anderen System Call verwenden. Die verschiedenen System Calls sind im Buch (ihr habt es doch jetzt alle runtergeladen oder?) im Appendix aufgelistet. Bisher habe ich immer nur den exit- system call verwendet. Der System Call ruft den Kernel an. Das läuft dann ungefähr so ab:
Kernel: Hallo, ja?
Programm: Ah, cool, hey, du, kannst du mal eben das Programm hier schließen?
Kernel: Wie meinen?
Programm: … *rollendeaugen* Orr guck einfach ins %eax, ok? Da steht alles drin.
Kernel: Hä jetzt tick doch nicht so aus!
Programm: …
Kernel: Jetzt sei doch nicht so. Was steht denn in %eax?
„1“. Ah, ok. Ja, sag das doch gleich!
Programm: Arsch. (legt auf)
Kernel: (legt auch auf)

Und das ist noch ein vergleichsweise simpler System Call. Ein anderer System Call veranlasst das Programm etwas in mein Terminal zu schreiben. Dafür braucht es aber schon ein paar mehr Parameter. Z.B. muss dafür auch bestimmt werden, wohin es überhaupt schreibt. Hier mal der Codedings:
  Mit .ascii können wir lustigerweise
hallo Berndo reinschreiben und müssen
nicht mühselig die Hex-Zahlen raussuchen
\n bedeutet „nächste Zeile“, damit das
später schöner aussieht.
Für den System Call „4“, also „write“,
brauchen wir zum einen den file
descriptor der in %ebx gespeichert
wird. Der bestimmt einfach nur, dass in
mein Terminal geschrieben wird und nicht
sonstwo hin. In %eax schreibe ich die Zahl
4. In %ecx muss der Anfang des Daten-
satzes stehen. (Zeile 11)
Bevor ich aber diese ganzen Sache mache
kümmere ich mich erst um das %edx
Register. Da muss die „range“ des Daten-
satzes rein. Die ermittle ich, indem ich
den Wert der Adresse am Anfang der Daten
von der Adresse am Ende subtrahiere. Die
Adressen zeigen ja an, in welchem Byte wir
uns „befinden“ auf dem Speicher. Es sind
Positionen, die dann natürlich so und so viele Bytes voneinander entfernt sind, da ja die Buchstaben dazwischen gespeichert sind. Die Differenz wäre also die „range“ der Zeichen dazwischen. Aber ist eigentlich alles nicht wichtig und so. Mit „int $0x80“ wird einmal der Kernel gerufen, der das alles durchführt. Dann kommt der übliche exit-system-call mit der Nummer eins. Die steht dann in %eax und ersetzt das was vorher drin war. In %ebx ist die Null, die ich wiederum aufrufen kann, wenn ich das mit „echo $?“ mache.

Und wenn ich das dann ausführe, sieht das halt so aus:


\o/ !!!!

Wir experimentierten dann noch etwas herum und fügten dem Hexalcode von „Hallo Berndo“ z.B. noch ein 7 hinzu.
Das würde dann so aussehen:

data:
 .int 72, 65, 76, 76, 79, 32, 66, 69, 82, 78, 68, 7
dataend:

(ascii wurde durch .int ersetzt)
7 ist witzigerweise eine Bell, die genau denselben beschissenen Ton macht, den wir erst vor ein paar Stunden von meinem Computer, aus meiner Lebensrealität und aus meinem Gedächtnis verbannt hatten. Aus Gründen…
Das erklärte auch, weswegen wir nichts hörten, als wir das Programm ausführten. Also baute erlehmann den Ton wieder ein und schrieb noch ein bisschen was dazu….

data:
 .int 72, 65, 76, 76, 79, 32, 66, 69, 82, 78, 68, 7, 7, ,7 , 7, 7
dataend:

Ja, das klappte dann zum Glück nicht. Aber so einiges klappte an dem Programm nicht. Es war  eigentlich eine ziemliche Quälerei und ein ewiges Austauschen von offensichtlich sehr einfachen Fragen, die ich trotzdem nicht beantworten konnte und meinem Herumgezicke, dass solche Fragen ja nichts bringen würden. Erschwerend kam hinzu, dass es bereits 4 Uhr morgens war. Meine Augenringe hingen gefühlt bis zum Kinn. Irgendwann trank ich aus Verzweiflung eine Verlierer-Tasse Kaffee und brach damit nebenbei meine Fastenzeit. Aber ok. Alles für den Code. Ganz oder gar nicht. Assembler oder html!

Aber nach 100 Fehlern machte ich auch mal was Richtiges. Und am Ende, nach dem Ausdünnen und Verschönern kam das doch eigentlich sehr hübsche Programm da oben dabei raus. Und Plom stolzierte ein bisschen herum und betonte, wie stolz er auf mich sei.
Erlehmann sagte gar nichts, weil wir wieder in den Modus verfallen waren, ihn immer gleich abzuwürgen, wenn er etwas sagen wollte. Wir waren sehr sehr müde. Aber zufrieden!

Am nächsten Tag – also eigentlich waren nur zwei Stunden vergangen aber ich konnte nicht mehr schlafen, ich glaub ich weiß auch wieso- schrieb ich als erstes völlig übermüdet in meinen IRC-Channel, dass ich wach bin. Und dass das doch irgendwie komisch ist. Was ich halt so mache, wenn ich noch nicht richtig denken kann. Und dann drückte ich ein paar mal zu häufig die Backspace-Taste.

Getaggt mit
%d Bloggern gefällt das: