Vorgelegt war Assemblercode, bei mir zur Fakultätsfunktion. Es war unoptimierter 64 bit Code in Intel Syntax. Die Funktion wurde dann gemeinsam analysiert, in dem er schrittweise zu einzelnenen Zeilen Fragen gestellt hat. Es hieß also nicht „Was macht das Programm?“, sondern ging schrittweise voran (für mein Gefühl schon zu langsam, nachdem wir ein gamzes Semester Assembler gelesen haben ;) )
Fragen waren ungefähr folgende:
32 oder 64 bit?
Prolog Epilog einzeichnen
Welche CallingConvention (er hat dazu gesagt, wurde für Linux compiliert → System V; man muss dafür nicht in den Code schauen)
Kurzer Exkurs Calling Conventions: Beide 64 bit und die 3 32bit (cdcl, stdcall, fastcall) unterschiede erklären. Bei den 64bit wollte er auch die Reihenfolge der Register wissen. Und welche Convention nutzen Linux Syscalls? - Eine eigene, die Fastcall ähnlich ist
Wieviel Parameter gibts es? - einer, edi
Was wird damit am Anfang gemacht? - Er wurde in eine lokale Variable geschrieben
Kann das ein Pointer sein? - Nein, weil Pointer 64 bit wären
Was ist es dann vermutlich? - int32_t
Basic Blöcke markieren
Es gibt einen Abbruchfall, wann tritt der ein? - wenn [0x…] == 0 (Lokale Variable, nicht edi wurde verglichen)
Hier wird der Vergleich mit cmp gemacht. Was macht cmp?
Geht der Test auf == 0 auch anders? - Ja mit test
Wie sieht das dann aus? test [0x…], 0x0? - Üblich ist test edi, edi. Ich hab gemeint test [0x…], edi wo er sich nicht ganz sicher war ob das gültig ist, hat es aber gelten lassen. test [0x…], [0x…] wäre aber falsch, weil 2 Speicherzugriffe
Hier wird eine Funktion aufgerufen. Was fällt auf? - Rekursiv
Mit welchen Parametern? - edi - 1
Was passiert dann weiter? - Hier wurde dann der restlichen Zeilen analysiert
So und was berechnet die Funktion nun? - Fakultät
Danach musste ich dann noch den Stackframe einzeichnen (Achtung, Parameter liegen nicht auf dem Stack, weil System V)
Das wars dann auch schon mit Assembler. (Sieht lange aus, aber dauert nicht so lang)