Grundlagen der Informatik III Wintersemester 2010/2011 – 5. Vorlesung Dr.-Ing. Wolfgang Heenes msg: main: int main() { printf("Hello, world!"); return 0; } 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 1 .data .asciiz "Hello, world!" .text .globl main la $a0,msg li $v0,4 syscall jr $ra Inhalt 1. Literatur 2. Kontrollstrukturen in Assembler 3. Hinweise zur praktischen Umsetzung 4. Zusammenfassung und Ausblick 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 2 Literatur [BO10] Bryant, Randal E. und David R. O´Hallaron: Computer Systems - A Programmer´s Perspective. Prentice Hall, 2010. 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 3 Kontrollstrukturen in Assembler Übersicht I In höheren Programmiersprachen sind verschiedene Kontrollstrukturen verfügbar I if/else I do-while Schleife I while Schleife I for Schleife I case Anweisungen I Umsetzung in IA32-Assembler, normalerweise Aufgabe eines Compilers I Ausgangspunkt: Pseudosprache (an C angelehnt) 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 4 Kontrollstrukturen in Assembler if/else I I 1 2 3 4 5 6 7 8 9 Programmausschnitt eines if/else Statements ... int int int if x; y; erg ; ( x<y ) erg = y−x ; else erg = x−y ; ... 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 5 Kontrollstrukturen in Assembler if/else II I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Realisierung in Assembler . data x: . long 3 y: . long 5 erg : . long 0 . g l o b l main movl x,%edx # edx e n t h ä l t x movl y,%eax # eax e n t h ä l t y cmpl %eax,%edx # V e r g l e i c h von y , x j g e . L2 s u b l %edx,%eax jmp . L3 . L2 : s u b l %eax,%edx movl %edx,%eax . L3 : movl %eax , erg 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 6 ( x−y ) Kontrollstrukturen in Assembler Kontrolloperationen I Vergleichsbefehle setzen die Statusflags Abbildung: Quelle: [BO10, S. 220] I Statusflags werden aber auch von addl, subl usw. gesetzt. 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 7 Kontrollstrukturen in Assembler Sprungbefehle I Man beachte die Bedingungen (Jump condition) Abbildung: Quelle: [BO10, S. 224] 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 8 Kontrollstrukturen in Assembler if/else III I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Realisierung in Assembler im Detail ... . g l o b l main movl x,%edx # edx e n t h ä l t x = 3 movl y,%eax # eax e n t h ä l t y = 5 # cmpl S2 , S1 −> S1 − S2 cmpl %eax,%edx # V e r g l e i c h von y , x (3 − 5) = −2 # j g e Bedingung : NOT ( SF XOR OF) , SF = 1 , OF = 0 , # Ergebnis i s t 0 , es w i r d a l s o n i c h t gesprungen j g e . L2 s u b l %edx,%eax jmp . L3 . L2 : s u b l %eax,%edx movl %edx,%eax . L3 : movl %eax , erg 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 9 Kontrollstrukturen in Assembler do-while Schleife I 1 2 3 4 5 6 7 8 Programmausschnitt einer do-while Schleife ... i n t r e s u l t = 1; i n t n = 5; do { r e s u l t *= n ; ( r e s u l t = r e s u l t * n ) n = n − 1; } while ( n > 1 ) ; ... 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 10 Kontrollstrukturen in Assembler do-while Schleife I 1 2 3 4 5 6 7 8 9 10 11 12 Realisierung in Assembler: erste Implementierung . data r e s u l t : . long 1 n: . long 5 . g l o b l main movl n,%ebx # ebx e n t h ä l t n movl $1,%eax # eax e n t s p r i c h t r e s u l t . L2 : i m u l l %ebx s u b l $1,%ebx cmpl $1,%ebx j g . L2 movl %eax , r e s u l t 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 11 Kontrollstrukturen in Assembler do-while Schleife I 1 2 3 4 5 6 7 8 9 10 11 Realisierung in Assembler: erste Optimierung . data r e s u l t : . long 1 n: . long 5 . g l o b l main movl n,%ebx # ebx e n t h ä l t n movl $1,%eax # eax e n t s p r i c h t r e s u l t . L2 : i m u l l %ebx s u b l $1,%ebx j g . L2 movl %eax , r e s u l t 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 12 Kontrollstrukturen in Assembler Statusbits I I I Der Ausführung des Sprungbefehls jg ist abhängig von den Sprungbedingungen. Die Sprungbedingungen bei jg sind: NOT (SF XOR OV) AND NOT (ZF) I I I I I SF - Signflag OF - Overflowflag ZF - Zeroflag Die Statusbits werden z. B. durch cmpl $1,%ebx gesetzt. Welche Statusbits setzt cmpl? I I I I I SF - Signflag OF - Overflowflag ZF - Zeroflag CF - Carryflag ... 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 13 Kontrollstrukturen in Assembler Statusbits II I Welche Statusbits setzt der subl? (vgl. Folie do-while Schleife, erste Optimierung) I I I I I I SF - Signflag OF - Overflowflag ZF - Zeroflag CF - Carryflag ... Offensichtlich verändern sowohl cmpl als auch subl die Statusbits. Der cmpl kann als Optimierung des Codes entfallen. 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 14 Kontrollstrukturen in Assembler Berechnung von Statusbits I I Ein paar Beispiele: Unterschied zwischen Carry und Overflow I Angenommen: 2K-Darstellung. Die Zahlen sind 4 Bit breit. Der Zahlbereich ist also von -8 bis +7 0101 0001 E: 0110 5 1 6 Es tritt kein Carry und kein Overflow auf. CF = 0, OF = 0 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 15 Kontrollstrukturen in Assembler Berechnung von Statusbits II I Ein paar Beispiele: Unterschied zwischen Carry und Overflow I Angenommen: 2K-Darstellung. Die Zahlen sind 4 Bit breit. Der Zahlbereich ist also von -8 bis +7 0101 0011 E: 1000 5 3 8 In diesem Fall tritt kein Carry, aber ein Überlauf auf. Beide Operanden 5 und 3 sind positiv. Das Vorzeichen aber ist negativ. CF = 0, OF = 1 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 16 Kontrollstrukturen in Assembler Berechnung von Statusbits III I Ein paar Beispiele: Unterschied zwischen Carry und Overflow I Angenommen: 2K-Darstellung. Die Zahlen sind 4 Bit breit. Der Zahlbereich ist also von -8 bis +7 0101 5 1111 -1 E: 1 0100 4 In diesem Fall tritt ein Carry, aber kein Überlauf auf. aber ist negativ. CF = 1, OF = 0 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 17 Kontrollstrukturen in Assembler Berechnung von Statusbits IV I Ein paar Beispiele: Unterschied zwischen Carry und Overflow I Angenommen: 2K-Darstellung. Die Zahlen sind 4 Bit breit. Der Zahlbereich ist also von -8 bis +7 I Beispiel von if/else (3+(-5)) 0011 3 1011 -5 E: 1110 -2 In diesem Fall tritt kein Carry und kein Überlauf auf. Das Vorzeichen ist negativ und das Vorzeichenbit (Signflag) wird eins. CF = 0, OF = 0, SF = 1 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 18 Kontrollstrukturen in Assembler do-while Schleife I 1 2 3 4 5 6 7 8 9 Realisierung in Assembler mit loop . data r e s u l t : . long 1 n: . long 5 . g l o b l main movl n,%ecx # ecx e n t h ä l t n movl $1,%eax # eax e n t s p r i c h t r e s u l t . L2 : i m u l l %ecx loop . L2 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 19 Kontrollstrukturen in Assembler Vergleich der Implementierungen I I I I Für eine do-while Schleife sind drei verschiedene Implementierungen möglich, die funktional identisch sind Wo sind jetzt die Vorteile? Takte der Befehle I imull %ebx ⇒ 141 Takte (bei 8086) I subl $1,%ebx ⇒ 4 Takte (bei 8086) I cmpl $1,%ebx ⇒ 4 Takte (bei 8086) I jg .L2 ⇒ 16 bzw. 4 Takte (Sprung ausgeführt bzw. nicht ausgeführt) I loop .L2 ⇒ 18 bzw. 5 Takte (Sprung ausgeführt bzw. nicht ausgeführt) Vergleich der Implementierungen I I I I I erste Implementierung: Anzahl der Takte 165 Takte erste Optimierung: Anzahl der Takte 161 Takte Verwendung loop: Anzahl der Takte 159 Takte Aber Achtung: akademische Rechnung Durch Pipelining und Sprungvorhersage kann man das nicht mehr genau sagen 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 20 Besonderheiten bei der IA32-Architektur imull und idivl I Wie funktioniert imull? I Erweiterung des Registers %eax zu dem Registerpaar %edx : %eax I Vor idivl: cdq (convert doubleword to quadword) oder cltd erweitert den Inhalt von 1 . L2 : i m u l l %ecx loop . L2 2 3 4 ... cdq i d i v l %ecx 5 6 7 ... 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 21 Besonderheiten bei der IA32-Architektur Arithmetische Operationen 64 Bit Abbildung: Quelle: [BO10, S. 216] 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 22 Besonderheiten bei der IA32-Architektur Arithmetische Operationen und Interrupts I Was passiert eigentlich bei der Division durch Null? I Es wird ein Interrupt ausgelöst und das Programm beendet. Weitere Ereignisse auf die der Prozessor reagieren sollte: I I I I Invalid Opcode, falscher Opcode Overflow, Überlauf Aber Achtung: Überlauf kann trotzdem auftreten (vgl. Übung 1). 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 23 Kontrollstrukturen in Assembler while Schleife I 1 2 3 4 5 6 7 8 Programmausschnitt einer while Schleife ... i n t r e s u l t = 1; i n t n = 5; w h i l e ( n > 1) { r e s u l t *= n ; ( r e s u l t = r e s u l t * n ) n = n − 1; } ... 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 24 Kontrollstrukturen in Assembler while Schleife I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Realisierung in Assembler . data r e s u l t : . long 1 n: . long 5 . g l o b l main movl n,%ebx # ebx e n t h ä l t n movl $1,%eax # eax e n t s p r i c h t r e s u l t cmpl $1,%ebx j l e . L7 . L10 : i m u l l %ebx s u b l $1,%ebx cmpl $1,%ebx j g . L10 . L7 : . . . 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 25 Kontrollstrukturen in Assembler Vergleich der do-while und while Schleife I Offenbar erstmal etwas aufwendiger (zwei Sprungbefehle statt einem), aber ... I Bestimmt noch Optimierungspotential I ... 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 26 Kontrollstrukturen in Assembler for Schleife I 1 2 3 4 5 Programmausschnitt einer for Schleife ... int int int for 6 7 i; r e s u l t = 1; n = 5; ( i = 2 ; i <= n ; i ++) r e s u l t *= i ; ( r e s u l t = r e s u l t * i ) ... 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 27 Kontrollstrukturen in Assembler for Schleife I 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Realisierung in Assembler . data r e s u l t : . long 1 n: . long 5 . g l o b l main movl n,%ebx # movl $2,%ecx # movl $1,%eax # cmpl $1,%ebx # j l e . L14 . L17 : i m u l l %ecx addl $1,%ecx cmpl %ecx ,%ebx j g e . L17 . L14 : . . . ebx e n t h ä l t n Schleifenvariable result Vergleich 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 28 i Kontrollstrukturen in Assembler Zusammenfassung: Schleifen I Im Prinzip kann auch die for Schleife mit einem loop abgedeckt werden. I loop .L2 ⇒ Verringert %ecx um eins und springt zur Speicheradresse (Label .L2), solange das Register nicht null ist. I Im Prinzip wird die Steuerung des Kontollflusses (if/else, Schleifen) mit cmpl und jg, jge, je etc. abgedeckt. 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 29 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 Kontrollstrukturen in Assembler Beispiel (auf dem RBG-Pool lauffähig) . data i n t o u t : . s t r i n g " E r g e b n i s %d \ n " r e s u l t : . long 1 n: . long 5 . text . g l o b l main main : movl n,%ebx # ebx e n t h ä l t n movl $2,%ecx # S c h l e i f e n v a r i a b l e i movl $1,%eax # r e s u l t cmpl $1,%ebx # V e r g l e i c h j l e . L14 . L17 : i m u l l %ecx a d d l $1,%ecx cmpl %ecx,%ebx j g e . L17 . L14 : . ende : p u s h l %eax # Wert im %eax ausgeben pushl $ i n t o u t call printf # Exit movl $1 , %eax i n t $0x80 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 30 Hinweise zur praktischen Umsetzung I I Die vorgestellten Programme sind alle auf den Rechnern der RBG getestet worden. I Teilweise sind (aus Darstellungsgründen) einige Zeilen weggelassen worden. I Eine vollständige Implementierung ist auf der Folie Kontrollstrukturen in Assembler – Beispiel (auf dem RBG-Pool lauffähig) zu finden. Was verhindert die Portierbarkeit dieser Programme z. B. auf Windows? I I I I I Sogenannte Systemcalls (movl $1, %eax, int $0x80): Dieser Systemcall dient der korrekten Beendigung des Programms 32 Bit Systeme, 64 Bit Systeme Aber selbst Linux-Systeme verhalten sich bzgl. der Systemcalls nicht gleich. Das ist der Nachteil: schlechte Portierbarkeit der Programme I Für das Grundverständnis (Übung und Pratika) reichen die RBG-Rechner. I Aufbau der eigenen Entwicklungsumgebung möglich, aber keinen Support. 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 31 Hinweise zur praktischen Umsetzung II I Es geht nicht darum, unlesbaren und schwer verständlichen Code zu schreiben. I Aus diesem Grunde ist es teilweise gefordert, vorher eine Hochsprachenimplementierung anzufertigen. I Aufgrund dieser Hochsprachenimplementierung sollen dann (wie in dieser Vorlesung vorgestellt) die Assemblerprogramme entwickelt werden. I Die Assemblerprogramme werden (in beliebiger Hochsprachensyntax wie C, Java, Pascal) kommentiert. I Ggf. einen Debugger wie gdb verwenden. Bei sorgfältiger Programmierung sollte das aber nicht notwendig sein. I Trial and error Programmierung nicht empfehlenswert 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 32 Startup Patrik und Wolfgang I Link zu Umfrage I http://bit.ly/MensaApp 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 33 Zusammenfassung und Ausblick I Kontrollstrukturen in Assembler Nächste Vorlesung behandelt I Datentypen I Bäume I Arithemtische Ausdrücke 2. November 2010 | Technische Universität Darmstadt | Dr.-Ing. Wolfgang Heenes | 34