Beruflich Dokumente
Kultur Dokumente
Ü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.
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
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
int 2 int 2
int 3 int 3
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
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.
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
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.
auszutauschende Informationen:
Parameter
Rückgabewerte
Rücksprungaddresse
auszutauschende Informationen:
Parameter
Rückgabewerte
Rücksprungaddresse
http://www.acs.eonerc.rwth-aachen.de