# Übung 2 Aufgabe 3 1. | Instruction | Kommentar | | --- | --- | | `push eax` | speichere wert aus eax auf dem stack | | `push ecx` | 2. Parameter wird auf Stack gepusht | | `push edx` | 1. Parameter wird auf Stack gepusht | | `call CAFEBABEh` | Subrotine an Adresse 0xCAFEBABE wird aufgerufen | | `add esp, 12` | Zuvor gepushte parameter werden aufgeräumt | | Instruction | Kommentar | | --- | --- | | `push ebp` | Wert von ebp wird auf Stack gespeichert | | `mov ebp, esp` | ebp Zeigt auf aktuellen stack pointer | | `sub esp, 4` | lokalen stackframe von 4 bytes reservieren | | `mov ecx, [ebp+8]` | schreibe parameter 1 nach ecx | | `add ecx, [ebp+12]` | addiere parameter 2 auf ecx (param1+param2) | | `mov [ebp-4], ecx` | schreibe wert aus eax in lokalen stackframe; int x = (param1+param2) | | `dec dword ptr[ebp-4]` | subtrahiere 1 von wert in lokalem stackframe; x-- | | `dec dword ptr[ebp-4]` | subtrahiere 1 von wert in lokalem stackframe; x-- | | `mov eax, [ebp-4]` | schreibe wert aus lokalem stackframe nach eax; return x | | `mov esp, ebp` | stelle alten stackpointer wieder her | | `pop ebp` | stelle alten basepointer wieder her | | `ret 8` | springe zurück zum aufrufenden punkt und räume den stack auf | 2. ``` int32_t f(int32_t a, int32_t b) { return (a+b)-2; } ``` 3. 4. Sowohl Caller, also auch Callee räumen den Stack auf. Darüber hinaus