Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
faecher:informatik:oberstufe:techinf:assembler:sprungbefehle:start [20.09.2021 22:03] – [(Sprung-)Schleifen] sbel | faecher:informatik:oberstufe:techinf:assembler:sprungbefehle:start [Unbekanntes Datum] (aktuell) – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Sprungbefehle ====== | ||
- | Sprungbefehle sind in Assemblersprache von elementarer Bedeutung, weil Verzweigungen und | ||
- | Wiederholungen mit Sprungbefehlen realisiert werden. Man unterscheidet **unbedingte** Sprungbefehle und **bedingte** Sprungbefehle. | ||
- | ===== Unbedingter Sprungbefehl - JMP ===== | ||
- | |||
- | Mit dem Befehl JMP, Jump, Springe, wird ein unbedingter Sprung ausgeführt. Die Syntax ist | ||
- | |||
- | <code asm> | ||
- | JMP SPRUNGZIEL | ||
- | </ | ||
- | |||
- | Das Sprungziel ist in der Regel eine Marke, die irgendwo im Programm erklärt ist. Eine Sprungmarke wird durch ihren Namen gefolgt von einem Doppelpunkt festgelegt: | ||
- | |||
- | <code asm> | ||
- | JMP programmende | ||
- | |||
- | ... | ||
- | ... ;weiterer Code, der niemals ausgeführt wird | ||
- | ... | ||
- | |||
- | programmende: | ||
- | | ||
- | | ||
- | </ | ||
- | |||
- | ===== Bedingte Sprungbefehle ===== | ||
- | |||
- | Bedingte Sprungbefehle sind von Bedingungen abhängig. Ist die Bedingung wahr, wird der Sprung ausgeführt, | ||
- | |||
- | Es gibt viele unterschiedliche bedingte Sprungbefehle, | ||
- | |||
- | Beispiele dafür sind: | ||
- | |||
- | * JC (Jump if Carry, Springe wenn Carryflag gesetzt) | ||
- | * JG (Jump if greater, Springe wenn größer) | ||
- | * JNE (Jump if not equal, Springe wenn nicht gleich) | ||
- | |||
- | Die Namen der bedingten Sprungbefehle (JXXX) sind nach folgendem Schema zusammengesetzt: | ||
- | |||
- | * **J** : immer erster Buchstabe, " | ||
- | * **N** : evtl. zweiter Buchstabe, " | ||
- | * **Z, | ||
- | * **E** : Equal, gleich | ||
- | * **A,B** : Above/ | ||
- | * **G,L** : Greater/ | ||
- | |||
- | Damit kann man eine ganze Menge von bedingten Sprüngen realisieren: | ||
- | |||
- | {{ : | ||
- | |||
- | |||
- | ===== Verzweigungen und (Sprung-)Schleifen ===== | ||
- | |||
- | Verzweigungen und Wiederholungsschleifen werden in Assemblersprache durch Sprungbefehle | ||
- | realisiert. Eine Verzweigung mit zwei Zweigen wird grundsätzlich folgendermaßen aufgebaut (die | ||
- | Namen der Marken sind natürlich frei wählbar): | ||
- | |||
- | < | ||
- | cmp Operand1, Operand2 | ||
- | jxxx Wahr-Zweig ; Bedingter Sprungbefehl, | ||
- | . | ||
- | ; | ||
- | . | ||
- | jmp Verzweigungsende; | ||
- | |||
- | Wahr-Zweig: | ||
- | . | ||
- | ; | ||
- | . | ||
- | Verzweigungsende: | ||
- | . | ||
- | ; Weiterer Programmablauf | ||
- | </ | ||
- | Der Wahrzweig kann auch entfallen, dann hat man einen bedingt ausgeführten Befehlsblock. | ||
- | |||
- | |||
- | ===== (Sprung-)Schleifen ===== | ||
- | |||
- | Die Abbruchbedingungen der Schleifen können das Erreichen eines bestimmten Zählwertes sein (Zählschleifen) oder datenabhängig formuliert werden. Die Grundkonstruktion einer (nicht abweisenden) Schleife kann folgendermaßen aussehen: | ||
- | |||
- | < | ||
- | Initialisierung der Schleife | ||
- | |||
- | Schleifenstart: | ||
- | | ||
- | | ||
- | | ||
- | </ | ||
- | |||
- | ===== Schleifen mit Loop Befehlen===== | ||
- | |||
- | Der Loop-Befehl ist ein Spezialbefehl für die Programmierung von Schleifen (engl. Loop = Schleife). Der Loop-Befehl erniedrigt CX bzw. in 32-Bit-Segmenten ECX und springt anschließend zu einem als Operanden angegebenen Sprungziel, falls CX bzw. ECX nicht 0 ist. | ||
- | |||
- | Damit lassen sich sehr einfach Zählschleifen programmieren, |