5. Vorlesung Dr.-Ing. Wolfgang Heenes - ra.informatik.tu

Werbung
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
Herunterladen