Assembler Kontrollstrukturen Dr.-Ing. Volkmar Sieh Department Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg SS 2008 Assembler Kontrollstrukturen 1/21 2008-04-03
Kontrollstrukturen Hochsprachen bieten i.a. eine Vielzahl verschiedener Konstrukte zur bedingten und wiederholten Ausführung von Anweisungen. Beispiele: i f (... ) {... } e l s e {... } switch (... ) { case... :... d e f a u l t :... } while (... ) {... } do {... } while (... ) ; f o r (... ;... ;... ) {... } goto... ; l a b e l :...... Assembler Kontrollstrukturen 2/21 2008-04-03
Komplexere Kontrollstrukturen lassen sich auf einfachere zurückführen. Beispiel: f o r ( i = 0 ; i < 1 6 ; i ++) { anw ( ) ; } erster Vereinfachungsschritt: i = 0 ; while ( i < 16) { anw ( ) ; i ++; } Assembler Kontrollstrukturen 3/21 2008-04-03
i = 0 ; while ( i < 16) { anw ( ) ; i ++; } nächste Vereinfachung: i = 0 ; goto t e s t ; l o o p : anw ( ) ; i ++; t e s t : i f ( i < 16) goto l o o p ; Assembler Kontrollstrukturen 4/21 2008-04-03
Allgemeine Umwandlungsregeln existieren. Beispiel: f o r (<A>; <B>; <C>) <D> erster Vereinfachungsschritt: <A> while (<B>) { <D> <C> } Assembler Kontrollstrukturen 5/21 2008-04-03
<A> while (<B>) { <D> <C> } näechste Vereinfachung: <A> goto t e s t ; l o o p : <D> <C> t e s t : i f (<B>) goto l o o p ; Assembler Kontrollstrukturen 6/21 2008-04-03
Wichtig: Es gibt für alle Programmiersprachen allgemeingültige Regeln, wie komplexe Kontrollstrukturen auf einfachere abzubilden sind! Assembler Kontrollstrukturen 7/21 2008-04-03
Komplizierte Bedingungen lassen sich vereinfachen. Beispiel: i f ( a > b && a!= 0) { anw ( ) ; } erster Vereinfachungsschritt: i f (! ( a > b ) ) goto end ; i f (! ( a!= 0 ) ) goto end ; anw ( ) ; end : ; Assembler Kontrollstrukturen 8/21 2008-04-03
i f (! ( a > b ) ) goto end ; i f (! ( a!= 0 ) ) goto end ; anw ( ) ; end : ; nächste Vereinfachung: i f ( a <= b ) goto end ; i f ( a == 0) goto end ; anw ( ) ; end : ; Assembler Kontrollstrukturen 9/21 2008-04-03
Allgemeine Regeln zur Vereinfachung von bedingten Sprüngen: i f (<a> && <b> &&... && <c>) goto <l a b e l > kann vereinfacht werden zu next : i f (! <a>) goto <next> i f (! <b>) goto <next>... i f (<c>) goto <l a b e l > Kurzschluss-Und Assembler Kontrollstrukturen 10/21 2008-04-03
Allgemeine Regeln zur Vereinfachung von bedingten Sprüngen: i f (<a> <b>... <c>) goto <l a b e l > kann vereinfacht werden zu i f (<a>) goto <l a b e l > i f (<b>) goto <l a b e l >... i f (<c>) goto <l a b e l > Kurzschluss-Oder Assembler Kontrollstrukturen 11/21 2008-04-03
Für die Terme <a>, <b> usw. gilt: hat der Term die Form x OP y mit OP {<, >, <=, >=, ==,! =,...}, so existiert dafür ein passender Assembler-Befehl hat der Term die Form!(x OP y) so läßt sich eine Vergleichoperation OP finden, sodaß gilt:!(x OP y) = x OP y hat der Term die Form!(x y... z) so kann der Term zu!x &&!y &&... &&!z vereinfacht werden (Regel von de Morgan) hat der Term die Form!(x && y &&... && z) so kann der Term zu!x!y...!z vereinfacht werden (Regel von de Morgan) Assembler Kontrollstrukturen 12/21 2008-04-03
Generelle Beobachtung: alle bedingten Ausführungen von Anweisungen sowie alle Schleifenkonstrukte lassen sich auf folgende zwei Anweisungs-Typen abbilden: goto label; if (a OP b) goto label; mit OP {<, >, =,! =, <=, >=,...} Assembler Kontrollstrukturen 13/21 2008-04-03
Kontrollstrukturen Sprünge Assembler-Code für unbedingte Sprünge: goto l a b e l ; => jmp l a b e l ; Assembler-Code für bedingte Sprünge: i f ( a OP b ) goto l a b e l ; => jop a, b, l a b e l Assembler Kontrollstrukturen 14/21 2008-04-03
Kontrollstrukturen bedingte Sprünge jop a, b, l a b e l jop erfordert drei Adressen (a, b, label). Diesen Befehl gibt es daher nur auf Drei-Adress-CPUs. Für Zwei- bzw. Ein-Adress-CPUs muss der Befehl aufgespalten werden: Zwei-Adress-CPU cmp a, b jop l a b e l Ein-Adress-CPU l d a a cmp b jop l a b e l Für die Zwischenspeicherung des Vergleichsergebnisses ist ein Register notwendig: Condition-Codes - oder Flags -Register (%eflags) Assembler Kontrollstrukturen 15/21 2008-04-03
Kontrollstrukturen bedingte Sprünge Beispiel: char a, b ; i f ( a < b ) goto l a b e l ; ergibt compiliert für i80x86: cmpb b, a j l l a b e l / jump i f l e s s / ergibt compiliert für m68x05: l d a b cmp a b l o l a b e l / branch i f l o w e r / Assembler Kontrollstrukturen 16/21 2008-04-03
Kontrollstrukturen bedingte Sprünge mögliche Bedingungen: i80x86 m68x05 = je beq!= jne bne >, >= unsigned ja, jae bhi, bhs <, <= unsigned jb, jbe blo, bls >, >= signed jg, jge bpl, - <, <= signed jl, jle bmi, -... Assembler Kontrollstrukturen 17/21 2008-04-03
Kontrollstrukturen Flags-Register Auch viele Arithmetik-Befehle setzen die Condition-Codes ( CC ) im Flags-Register; Beispiele: Zero-Flag: gesetzt, wenn Ergebnis 0 ist Negative-/Sign-Flag: gesetzt, wenn das höchstwertige Bit des Ergebnisses 1 ist Carry-Flag: bei Übertrag gesetzt...... Assembler Kontrollstrukturen 18/21 2008-04-03
Kontrollstrukturen Flags-Register Bedingte Sprünge nutzen die Condition-Codes (Beispiel i80x86): je (jump if equal) verzweigt, wenn Zero-Bit gesetzt ist jl (jump if less) verzweigt, wenn Negative-Bit gesetzt ist jle (jump if less or equal) verzweigt, wenn Zero- oder Negative-Bit gesetzt sind... cmp-befehl subtrahiert die zwei Operanden, setzt die CC-Bits entsprechend, speichert aber das Subtraktionsergebnis nicht. Assembler Kontrollstrukturen 19/21 2008-04-03
Kontrollstrukturen Hinweise Statt einer Adresse als Sprungziel wird häufig die Differenz zur Adresse der aktuellen (oder nächsten) Instruktion angegeben (meist eine kleinere Zahl); Beispiel: 0 8 :... 0 9 : j l e 25 1 0 :... => 0 8 :... 0 9 : j l e +16 1 0 :... Assembler Kontrollstrukturen 20/21 2008-04-03
Kontrollstrukturen Hinweise Vorteile: weniger Speicheraufwand schnellere Befehlsausführung unabhängig von der tatsächlichen Lage des Programms im Speicher ( Position-Independant-Code (PIC)) Nachteile: mühsamere Berechnung (wird meist vom Assembler/Linker übernommen) nicht alle Sprungziele erreichbar (lange Version zusätzlich notwendig) Assembler Kontrollstrukturen 21/21 2008-04-03