Neben den unbedingten Sprüngen gibt es – wenig überraschend – auch die bedingten Sprünge, die nur dann ausgeführt werden, wenn eine bestimmte Bedingung erfüllt ist. Auch hierzu ein diesmal etwas sinnvolleres Beispiel (die Erklärung folgt darunter, die Zeilen sind nummeriert):

(1)       mov al, 0
(2)       mov bl, var1
loop:
(3)       sub bl, var2
(4)       cmp bl, 0
(5)       jl end
(6)       inc al
(7)       jmp loop
end:
(8)       add bl, var2

Nehmen wir an, dass in den Variablen var1 und var2 zwei Werte gespeichert sind, wobei wir die Gleichung var1 / var2 berechnen wollen, und zwar ganzzahlig und mit Rest. In den ersten beiden Zeilen (1) und (2) des Codes wird das Register al mit dem Wert 0 und das Register bl mit dem Wert von var1 gefüllt. Anschließend folgt eine Sprungmarkierung. In der darauffolgenden Zeile (3) wird vom Wert in bl der Wert von var2 abgezogen. Anschließend erfolgt in (4) ein Vergleich (cmp von englisch “compare”) von bl und dem festen Wert 0. Dabei werden intern im Prozessor einige sogenannte Flags (separate Register mit einer Größe von nur einem Bit) gesetzt, je nachdem, ob der erste Wert größer, kleiner oder gleich dem zweiten Wert ist. Die Magie passiert in der nächsten Zeile (5): jl end ist ein bedingter Sprung (jl von englisch “jump less”), der in diesem Fall genau dann ausgeführt wird, wenn der vorhergehende Vergleich ergeben hat, dass der erste Wert kleiner als der zweite ist (für die Kenner: der Sprung wird durchgeführt, wenn das Zeroflag auf 0 und das Signflag ungleich dem Overflowflag ist). Ist dies nicht der Fall, wird in Zeile (6) der Wert im Register al um eins erhöht (inc von englisch “increment) und anschließend in (7) zurück zum Anfang der Schleife gesprungen. Wird der bedingte Sprung dagegen durchgeführt, wird noch die letzte Anweisung (8) hinter der Schleife ausgeführt, in welcher auf den Wert in Register bl noch einmal der Wert von var2 draufaddiert wird, um den korrekten Rest zu berechnen.

Eigentlich alles ganz klar, oder? Nein? Gut, hier eine kleine Wertetabelle für eine Beispielrechnung; nehmen wir an var1 hat den Wert 8 und var2 den Wert 3, wir wollen also 8/3 berechnen. Damit ergibt sich die folgende Tabelle; jede Zeile markiert einen Ausführungszyklus:

Codezeile al bl Bemerkung
2 0 8 Initialisierung
3 0 5 Berechnung von: bl – var2
4 0 5 Vergleich: 5 < 0?
5 0 5 5 ist nicht kleiner als 0, also passiert nichts
6 1 5 Inkrement: al
7 1 5 Sprung zurück zu “loop”
3 1 2 Berechnung von: bl – var2
4 1 2 Vergleich: 2 < 0?
5 1 2 2 ist nicht kleiner als 0, also passiert nichts
6 2 2 Inkrement: al
7 2 2 Sprung zurück zu “loop”
2 2 2 Berechnung von: bl – var2
4 2 -1 Vergleich: -1 < 0?
5 2 -1 -1 ist kleiner als 0, also Sprung zur Markierung “end”
8 2 2 Addition: bl + var2

 

Und in der Tat: 8 geteilt durch 3 ergibt bei ganzzahliger Division 2, Rest 2. Mal ehrlich: so schwer war es am Ende nun doch nicht, oder? Mit ein wenig Konzentration und gutem Willen lässt sich Assemblercode doch relativ gut verstehen. Zumindest besser als reiner Maschinencode. Aber ich gebe gerne zu, dass auch Assemblercode nicht optimal ist; zumindest wird er den Anforderungen der modernen Programmierwelt definitiv nicht gerecht. Er bietet jedoch die Möglichkeit, auf einer sehr niedrigen Ebene Programme schreiben (und vor allem auch später wieder lesen) zu können und wird auch heutzutage noch ab und zu benutzt. Die hauptsächliche Programmierung von Computern wird aber mit sogenannten Hochsprachen durchgeführt – aber die schauen wir uns ein andermal an.

1 / 2 / 3 / 4

Kommentare (20)

  1. #2 Marcus Frenkel
    August 31, 2011

    Interessant. Ich habe noch nie von der Maschine gehört – wieder etwas gelernt. Die “Initial Orders”-Sprache erscheint mir zwar wirklich wie ein reiner Aufsatz auf Maschinencode, aber gut, Assembler ist es trotzdem. Danke.

  2. #3 Nele
    August 31, 2011

    Sehr cooler Artikel. Das erinnert mich an die 80er, als ich noch einen 8-Bit-Computer in Z80-Code programmiert habe. Damals habe ich per Hand und Rodnay Zaks Z80-Bibel assembliert und das ganze dann mit einem Monitor byteweise in den Speicher geschrieben. Mit Monitor meine ich jetzt nicht das Datensichtgerät sondern die Software zur Kontrolle des Computers auf Prozessorebene.

    Das war die beste Möglichkeit überhaupt, ein einfaches Computersystem von Grund auf kennen zu lernen. Mit den heutigen Computerarchitekturen geht sowas wahrscheinlich überhaupt nicht mehr. 🙂

  3. #4 Marcus Frenkel
    August 31, 2011

    Ach, das geht schon auch mit heutigen Architekturen; sie haben ja immer noch die Befehle von damals (plus eine Menge mehr). Zum Kennenlernen kann da auf Assemblerebene mit einfachsten Sachen gearbeitet werden; wer richtig in die Tiefe will, kann sogar ein einfaches Betriebssystem programmieren, das ist auch nicht so sehr kompliziert (durch die vielen SSE-Befehle sogar eher einfacher).

    Und dank Virtualisierung muss man dabei nicht einmal seinen eigenen Rechner lahmlegen. 😉

  4. #5 cimddwc
    August 31, 2011

    Mit entsprechenden Hochsprachen-Makros angereichert, kann man auch heutzutage noch ganz gut größere Programme in Assembler schreiben, finde ich. 🙂 Nur Berechnungen werden gern etwas umständlich.

    Richtig lustig wird’s dann mit Befehlen wie cvttpd2pi, maskmovdqu, punpcklbw, rsqrtss und was die Hersteller sich sonst so alles im Rahmen von SSEx & Co. ausgedacht haben… zum Glück brauch ich die eher selten bis gar nicht. 🙂

  5. #6 Informatiker (grad) ohne Durchblick
    August 31, 2011

    Erst mal vielen Dank für die ganzen hoch interessanten Blogbeiträge. Hab ich zwar fast alles schon mal gehört, aber eine Auffrischung tut immer gut. Vor allem wenn sie so anschaulich und verständlich geschrieben ist.

    Allerdings tu ich mich grad mit der Tabelle etwas schwer, genauer mit den Einträgen für al. Denn in Zeile 6 (der Tabelle) wechselt der Wert von 1 auf 0 und in Zeile 12 von 2 auf -1. Wieso?
    Ist das ein Tippfehler, oder stehe ich grad völlig auf dem Schlauch.

  6. #7 Marcus Frenkel
    August 31, 2011

    @Informatiker (grad) ohne Durchblick
    Das waren Tippfehler. Oder besser: Copy&Paste-Fehler; jeder Informatiker weiß, dass man das nicht macht. Jeder Informatiker macht es trotzdem. Meine Güte.

    Danke für den Hinweis, die sind mir beim Probelesen durch die Lappen gegangen. 😉

  7. #8 rolak
    August 31, 2011

    Na endlich. Meine Lieblingssprachen 🙂

    aber Informatiker sind zuweilen recht faul, was diese Unterscheidung angeht

    Auch wenn (z.B. als von mir ausgehende Verallgemeinerung) die Einsortierung richtig sein könnte – es wären zwei (10) Dinge anzumerken:

    • Es gibt so etwas wie produktive Faulheit, wie z.B. die Verbeserung von Vorhandenem, weil nicht so lange gewartet werden möchte etc pp
    • Informatiker wissen berufsbedingt um die Verschiedenheit von Wort und Bedeutung, haben kein Problem damit, verschiedene ähnliche Bedeutungen mit einem einzigen Wort zu beschreiben, so lange es der Kontext erlaubt auf das Gemeinte zu schließen. Bei Teekesselchen im allgemeinen ‘beschwert’ sich ja auch keiner – obgleich die Bedeutungen dort oft wesentlich weiter auseinanderklaffen.

    die Bitketten konnten allerdings nicht einfach komfortabel am Rechner eingegeben werden, sondern mussten noch manuell auf ein Trägermedium transferiert werden

    Nun ja, ‘komfortabel’ kann es wirklich nicht genannt werden, aber ‘am Rechner’ war sehr wohl nicht nur möglich, sondern teilweise sogar nötig. Selbst zu meinen Lebzeiten liefen noch Rechner (wars ne PDP11 oder doch eine 9er?) mit einer Hex-Tastatur (und das war schon golden, eine Reihe Schalter war durchaus üblich) plus ein Taster, mittels der byte für byte, binary of cause, der loader eingepiddelt werden konnte, der dann den ersten Lochstreifen einlas.
    Oder bei meinem 8085 die paar byte handgelötetes DiodenROM, dessen code über die cpu-eingebaute serielle Schnittstelle und die gebastelte PLL vom Flohmarkt-Kassettenrekorder den Monitor las, letzterer, wie oben schon erwähnt, so eine Art OS für Arme. Dieses Rom war die Verbesserung (aus Faulheit!) der kleinen Zähler/dipswitch/latch-Kombination, mit der bis dahin die loader-bits ins RAM getrieben wurden.
    Also bitte, ein festes BIOS ist doch schon absoluter Luxus :p

  8. #9 Marcus Frenkel
    August 31, 2011

    Nun ja, ‘komfortabel’ kann es wirklich nicht genannt werden, aber ‘am Rechner’ war sehr wohl nicht nur möglich, sondern teilweise sogar nötig.

    Akzeptiert und korrigiert. 😉
    Das war vor meiner Zeit. Ich hatte zwar im Kopf, dass Maschinencode auch direkt eingegeben wurde (unter anderem auch über die erwähnten Schalter), aber hatte bei Maschinencode in erster Linie die Lochkarten vor Augen. 😉

    Und: niemand hat gesagt, dass Faulheit nicht schlecht wäre. Sie verwirrt nur manchmal die Außenstehenden – und manchmal sogar Informatiker selber. Man denke nur an die Verwirrung über den Zusammenhang zwischen “Parsern” und “Compilern”…

  9. #10 rolak
    August 31, 2011

    niemand hat gesagt, dass Faulheit nicht schlecht wäre

    Ich. Gerade eben oben 🙂

    Übrigens ist in der rss-mail hinter dem smilie hinter dem ‘korrigiert’ ein Zeilenvorschub, der hier im HTML nicht auftaucht. Wunder über Wunder…
    Das mit der Faulheit erkläre ich typischerweise etwas überhöht, um die merkwürdigen Gesichter des Gegenübers zu bewundern. Auf ‘Du bist faul’ rechnet wohl keiner mit einem ‘Na zum Glück!’. Doch aufgepasst, es gibt auch die dunkle Seite der Faulheit…

    Das mit P&C ist doch simpel: nur einer trägt seinen Namen zurecht; der eine gibt einem Zeichenstrom Struktur, der andere nimmt sie einer source; das Ergebnis des einen wird typischerweise von einem Programm ausgewertet, das des anderen von einer cpu 😉 Trotzdem, ich kann nicht verhehlen daß diese ein-Wort-für-alle-Nummer eine der vielen Varianten ist, mit denen nicht nur ich meine Gegenüber ‘teste’, schaue ob genügend frei assoziierend mitgedacht wird, Reaktionen in Wort und Mimik genieße. Spielfreude.

    Zu der Rechnerfamilie von eben fiel mir noch einer dieser uralten koans ein, den ich vorsichtshalber mal kopiere:

    In the days when Sussman was a novice, Minsky once came to him as he sat hacking at the PDP-6.
    “What are you doing?”, asked Minsky.
    “I am training a randomly wired neural net to play Tic-Tac-Toe” Sussman replied.
    “Why is the net wired randomly?”, asked Minsky.
    “I do not want it to have any preconceptions of how to play”, Sussman said.
    Minsky then shut his eyes.
    “Why do you close your eyes?”, Sussman asked his teacher.
    “So that the room will be empty.”
    At that moment, Sussman was enlightened.

  10. #11 JPeelen
    August 31, 2011

    Die Programmiersprachen der frühen programmierbaren Taschenrechner (in meinem Fall ein TI-59) waren den Assemblersprachen sehr ähnlich. Schleifen und logische Verzweigungen wurden in derselben Weise mit Labels und GOTO definiert. Man konnte sogar den vorhandenen Speicher variabel in einen Teil für Programmcode und einen zur Datenspeicherung aufteilen. Aufrufbare Unterprogramme ließen sich definieren.
    Der Knaller war die Möglichkeit, diese Programme auf kleinen (Format wie ein Kaugummistreifen) Magnetkarten zu speichern, die ein Motor durch den Rechner zog.

  11. #12 Marcus Frenkel
    August 31, 2011

    @JPeelen
    Die Sprachen der aktuellen Taschenrechner (also “aktuell” heißt hier, aus meiner Schulzeit; ist also auch schon einige Jahre her) sahen da immer noch nicht besser aus. 😉

    @rolak
    Ein schöner Zeitvertreib. 😉

  12. #13 rolak
    August 31, 2011

    Die TI59 waren schon heiße Teile, lehrten mich einiges zum Thema Preisverfall: Nach dem Ferienjob einen zu 700DM erstanden, nach Weihnachten gabs den für unter 400… Aber allein das Pfeifen, wenn eine der Karten durchrutschte 😉

    Und ja, das war vor über 30 Jahren alles schon so wie heute auch noch: Die Dinger wurden gehackt durch Modifikation des Taktgenerators (‘overclocking’ gabs damals noch nicht) und wilde Programmcodekombinationen, gecrackt so daß die internen und die wechselbaren ROMs ausgelesen und auf Karte(n) übertragen werden konnten zum Verteilen (am besten im Diktat, sonst schriftlich) und reverse engineering (immer schriftlich), (usergestütztes) Paging in den swapfile aka Kartenstapel gab es auch schon.

    Und dann brachten diese $@$&#?!cnpxneqf den HP41 raus…

  13. #14 Dr. Webbaer
    September 3, 2011

    Wo wird noch mit Assembler entwickelt?

    MFG
    Dr. Webbaer (der selbst immerhin noch ein Einsatzgebiet kennt)

  14. #15 Marcus Frenkel
    September 3, 2011

    Im Spielebereich, im Betriebssystembereich, überall dort, wo gewisse Mikrooptimierungen vorgenommen werden müssen, im Compilerbau, im Grafikbereich, bei der Treiberprogrammierung…

  15. #16 Dr. Webbaer
    September 3, 2011

    Aja, danke. Assembler lebt also.
    MFG Wb

  16. #17 rolak
    September 4, 2011

    “If a program can’t rewrite its own code”,
    he asked, “what good is it?”
    (src)

    Das ginge zwar in (extrem wenigen) Hochsprachen auch, doch wenn es {zusätzlich} wesentlich ist, das generierte Kompilat auch in größeren Sequenzen auf Bitebene zu kontrollieren, geht nichts am jeweiligen Assembler vorbei.
    Selbst wenn dies wg exzessiver Verwendung camouflierender HLL-Makros kaum mehr auffallen sollte.

  17. #18 Mj
    September 11, 2011

    wer richtig in die Tiefe will, kann sogar ein einfaches Betriebssystem programmieren, das ist auch nicht so sehr kompliziert (durch die vielen SSE-Befehle sogar eher einfacher).
    Und dank Virtualisierung muss man dabei nicht einmal seinen eigenen Rechner lahmlegen. 😉

    Wie würde man das machen? Also mit welchen Tools optimalerweise?

  18. #19 rolak
    September 11, 2011

    Wie würde man das machen?

    Was, das Lahmlegen? 😀

    Also mit welchen Tools optimalerweise?

    Möglichst mit solchen, die Deinem Stil entgegenkommen. Generell Assembler und Debugger – ich nutze A386/D386, freie Software gibt es zu Hauf, wie z.B. nasm/gdb. Die erste schöne Übung ist ein (im Laufe der Zeit immer komfortabler werdender) ohne Betriebssystem auskommender Schmal-Debugger, der die Aktivitäten des startenden Erzeugnisses protokolliert…
    Wie bei der BS-Entwicklung allerdings SSE hilfreich sein soll, erschließt sich mir noch nicht^^

    Oh ja, einen der vielen Virtualisierer bräuchtest Du natürlich auch noch, es sei denn, Dir wäre ein separater PC als Spielwiese lieber.
    Und nicht vergessen: Es gibt viel zum Abgucken und Lernen (bsp)!

  19. #20 Geldhai
    September 16, 2011

    Lahmlegen verstehe ich jetzt auch nicht