Sie sind auf Seite 1von 18

Grundgebiete der Informatik 4

Übung 5
Stack und Funktionen
Alexander Pastor
Institute for Automation of Complex Power Systems
A1 - Stack
A1 - Stack

Die imul Instruktion überschreibt das rdx Register und signalisiert mit dem Overflow Flag
und dem Carry Flag, ob ein Überlauf stattgefunden hat. Hierbei geht der ursprüngliche
Inhalt des Registers rdx verloren.
Schreiben Sie ein exemplarisches 64 Bit Assemblerprogramm, das eine sichere Multiplikation
von 2 Variablen realisiert. Hierbei soll der Inhalt des Registers rdx auf den Stack gesichert
und nach der Multiplikation wiederhergestellt werden.
Zeichnen Sie den Inhalt des Stacks zu Beginn des Progamms und unmittelbar nach der
Multiplikation.

3 von 17 Grundgebiete der Informatik 4 - Übung 5 | Alexander Pastor | ACS


29.05.2020
A1 cont’d

1 DEFAULT REL
2
3 SECTION .data
4 var1 dq 5

9 global main
10
11 main :
12 mov rax , qword [ var1 ] ; beide Faktoren laden
13 mov rbx , qword [ var2 ]
14
15 push rdx ; rdx sichern
16 imul rbx ; rdx : rax = rax * rbx
17 jnc noproblem ; wenn carry und overflow flags nicht gesetzt ,
18 jno noproblem ; dann gab es keinen Ueberlauf (32 Bit Ergebnis )
19
20 mov qword [ ergebnis +8] , rdx ; rdx speichern (64 Bit Ergebnis )
21 noproblem :
224 von 17 mov Grundgebiete
qword der[ Informatik
ergebnis ] ,5 | rax
4 - Übung Alexander;Pastor
rax | ACSspeichern
29.05.2020
A1 cont’d

vorher während danach


... ... ...
Wert ⇐ rsp Wert Wert ⇐ rsp
Inhalt von rdx ⇐ rsp Inhalt von rdx

5 von 17 Grundgebiete der Informatik 4 - Übung 5 | Alexander Pastor | ACS


29.05.2020
A2 - Funktionen
A2, a) - Funktionen

a) Ein Codefragment benutze lokal 6 Integervariablen (int, jeweils 4 Byte), einen 20


Zeichen langen String (char, jeweils 1 Byte) und 2 Gleitkommazahlen (double, jeweils 8
Byte). Die lokalen Variablen befinden sich in der obigen Reihenfolge auf dem Stack.
Zeichnen Sie den Aufbau des Stacks!

7 von 17 Grundgebiete der Informatik 4 - Übung 5 | Alexander Pastor | ACS


29.05.2020
A2, a) cont’d

niedrige → hohe Adr.


hohe ...
Adressen
int 1

int 2

int 3

int 4

int 5

int 6
q r s t
m n o p

i j k l
e f g h
a b c d

double 1

double 2

niedrige ...
Adressen

8 von 17 Grundgebiete der Informatik 4 - Übung 5 | Alexander Pastor | ACS


29.05.2020
A2, a) - Funktionen

a) Ein Codefragment benutze lokal 6 Integervariablen (int, jeweils 4 Byte), einen 20


Zeichen langen String (char, jeweils 1 Byte) und 2 Gleitkommazahlen (double, jeweils 8
Byte). Die lokalen Variablen befinden sich in der obigen Reihenfolge auf dem Stack.
Zeichnen Sie den Aufbau des Stacks!
Was passiert, falls die Länge des Strings nicht berücksichtigt wird und 30 Zeichen in die
Stringvariable kopiert werden?

9 von 17 Grundgebiete der Informatik 4 - Übung 5 | Alexander Pastor | ACS


29.05.2020
A2, a) cont’d
Nach dem Überschreiben:
niedrige → hohe Adr. niedrige → hohe Adr.
hohe ... hohe ...
Adressen Adressen
int 1 int 1

int 2 int 2

int 3 int 3

int 4 C D Teil von int4


int 5 y z A B
int 6 u v w x
q r s t q r s t
m n o p m n o p

i j k l i j k l
e f g h e f g h
a b c d a b c d

double 1 double 1

double 2 double 2

niedrige ... niedrige ...


Adressen Adressen
10 von 17 Grundgebiete der Informatik 4 - Übung 5 | Alexander Pastor | ACS
29.05.2020
A2, b) - Funktionen

b) Der Stack wird auch genutzt um die lokalen Variablen von Funktionen zu verwalten. Jede
Funktion benutzt nur ihren eigenen Teil des Stacks, hierbei werden die Register rsp und rbp
genutzt. rbp ist fix und zeigt auf den Beginn des lokalen Stackframes, rsp zeigt auf die
letzte belegte Speicherstelle des Stacks.
Die aktuelle Funktion übergibt die Kontrolle an eine andere Funktion, indem sie die
Instruktion call ausführt. Die aufgerufene Funktion merkt sich den alten Wert von rbp,
indem sie ihn auf den Stack sichert.
Zeichnen Sie den Stack nachdem eine Funktion A mit den lokalen Variablen
int i, j, k; char a, b; die Funktion B mit den lokalen Variablen
int l, m; double x, y; aufgerufen hat und die Funktion B ihre lokalen Variablen
eingerichtet hat. Der Datentyp int sei hier 4 Bytes breit, der Datentyp char ein Byte und
der Datentyp double 8 Bytes.

11 von 17 Grundgebiete der Informatik 4 - Übung 5 | Alexander Pastor | ACS


29.05.2020
A2, b) cont’d

hohe niedrige → hohe Adr.


...
Adressen
i
j Variablen A
k
b a
Rücksprungadresse in A
Stack ist hier mit 4 Byte breiten Zellen ge
RBP von A ⇐ RBP lokale Variablen zwischen rsp und rbp
l rsp durch Instruktionen veränderbar
m rbp bleibt fest
x Variablen B
niedrige y ⇐ RSP
Adressen
12 von 17 Grundgebiete der Informatik 4 - Übung 5 | Alexander Pastor | ACS
29.05.2020
Einschub: Anlegen von lokalen Variablen

1 funktion :
2 push rbp
3 mov rbp , rsp
4
5 sub rsp , 8 ; zwei 4 Byte grosse lokale Variablen
6
7 ; Code der Funktion
8 mov dword [ rbp -4] , 1 ; Zugriff auf erste lokale Variable
9 mov dword [ rbp -8] , 2 ; Zugriff auf zweite lokale Variable
10 ;
11
12 mov rsp , rbp
13 pop rbp
14
15 ret

13 von 17 Grundgebiete der Informatik 4 - Übung 5 | Alexander Pastor | ACS


29.05.2020
Einschub: Ausrichtung des Stacks / Alignment

Weiterer Unterschied zwischen 32 Bit und 64 Bit x86 Assembler:


rsp muss beim Funktionsaufruf (call Instruktion) an 16 Byte Grenze ausgerichtet sein.
rsp % 16 == 0
Realisierbar durch and rsp, (1 << 64) - 16

14 von 17 Grundgebiete der Informatik 4 - Übung 5 | Alexander Pastor | ACS


29.05.2020
A2, c) - Funktionen

c) Die letzte in diesem Übungsblatt aufgezeigte Verwendung des Stacks ist die Übergabe
von Parametern bei 32 & 64 Bit Systemen. Die oben betrachteten Funktionen hatten keine
Möglichkeit miteinander zu kommunizieren.
Diskutieren Sie, wie eine Funktion int max(int a, int b), welche die größere der beiden
Zahlen a und b zurückgeben soll, dies bewerkstelligen kann.
Erörtern Sie, wie die Funktion max an die Werte von a und b gelangen könnte und wie das
Ergebnis zurückgegeben werden könnte.

15 von 17 Grundgebiete der Informatik 4 - Übung 5 | Alexander Pastor | ACS


29.05.2020
A2, c) cont’d

auszutauschende Informationen:
Parameter
Rückgabewerte
Rücksprungaddresse

16 von 17 Grundgebiete der Informatik 4 - Übung 5 | Alexander Pastor | ACS


29.05.2020
A2, c) cont’d

auszutauschende Informationen:
Parameter
Rückgabewerte
Rücksprungaddresse

Welche Möglichkeiten existieren, um diese Informationen auszutauschen?


nur über die Register (bei Windows: fastcall-Konvention)
nur über den Stack (stdcall, c-call)
über den Arbeitsspeicher (z.B. bei Interrupts)
mittels Mischformen (System V AMD64, thiscall, fastcall)

16 von 17 Grundgebiete der Informatik 4 - Übung 5 | Alexander Pastor | ACS


29.05.2020
Kontakt:
Alexander Pastor – acs-teaching-gi4@eonerc.rwth-aachen.de

Institute for Automation of Complex Power Systems


E.ON Energy Research Center
RWTH Aachen University
Mathieustr. 10
D-52074 Aachen

http://www.acs.eonerc.rwth-aachen.de

Das könnte Ihnen auch gefallen