Sie sind auf Seite 1von 3

Institute for Automation of Complex Power Systems

Dr. rer. nat. Stefan Lankes

Übung 3: Assembler 2

Aufgabe 1: 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üngli-
che Inhalt des Registers rdx verloren.
Das Ziel ist es nun, ein Assemblerprogramm zu schreiben, 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.
a) Zeichnen Sie den Inhalt des Stacks zu Beginn des Progamms und unmittelbar nach
der Multiplikation.
b) Schreiben Sie nun das Programm in 64 Bit x86-Assembler.

Aufgabe 2: 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, je-
weils 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 Zei-
chen in die Stringvariable kopiert werden?
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 loka-
len 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.
c) Die letzte in diesem Übungsblatt aufgezeigte Verwendung des Stacks ist die Überga-
be von Parametern bei 32 & 64 Bit Systemen. Die oben betrachteten Funktionen hat-
ten keine Möglichkeit miteinander zu kommunizieren. Diskutieren Sie, wie eine Funk-
tion int max(int a, int b), welche die größere der beiden Zahlen a und b zurück-

GIN3 Übung 3 WS 23 / 24
geben 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.

Aufgabe 3: Anaylse eines Assembler-Programms


Das folgende Assembler-Programm soll im Rahmen dieser Aufgabe analysiert werden.
1 DEFAULT REL
2
3 extern exit
4 extern printf
5
6 global main
7
8 SECTION .text
9 main:
10 push rbp
11 mov rbp , rsp
12 sub rsp , 8
13
14 mov rbx , 0x39
15 mov qword [rbp -8] , 0x30
16
17 ALIGN 8
18 .schleife :
19 cmp rbx , qword [rbp -8]
20 je .ende
21
22 mov byte [msg+msg_len -4] , bl
23
24 mov rdi , qword msg
25 call printf
26
27 dec rbx
28 jmp .schleife
29
30 .ende:
31 add rsp , 8
32 pop rbp
33
34 mov rdi , 0
35 call exit
36
37 mov rax , 0
38 ret
39
40 SECTION .data
41 CR equ 13

GIN3 Übung 3 WS 23 / 24
42 LF equ 10
43 msg db "Hello World ! ebx = ?", CR , LF , 0
44 msg_len equ $ - msg
Listing 1: Beispielprogramm

a) Erläutern Sie kurz und prägnant die Funktionsweise des Beispielprogramms.

GIN3 Übung 3 WS 23 / 24

Das könnte Ihnen auch gefallen