%% -*- mode: latex; TeX-master: "compilerbau.tex"; -*-

\begin{slide}{Lokale Unterprogramme: Beispiel}

Das geht in Standard-C nicht (aber \verb|gcc| kann es doch):
\begin{verbatim}
int f ( int x ) {
  int g ( int y ) {
    int h ( int z ) {
      return x + y + z; 
    } 
    return h (h (h (0))); 
  }    
  return g (g (0)); 
}      
\end{verbatim}
Wie verläuft die Rechnung \verb|f(3)|?

\end{slide}

\begin{slide}{Lokale Unterprogramme: Implementierung}

Für jeden Aufruf eines Unterprogramms gibt es einen Frame.

Werte von lokalen Variablen aus umgebenden Blöcken
müssen aus entsprechenden Frames gelesen werden.

Wie findet man diese? (Es ist \emph{nicht} unbedingt der direkt
vor dem aktuellen Frame liegende.)

Lösung: \emph{statische Kette}. 

Jeder Frame (eines lokalen Unterprogramms)
enthält einen Verweis auf den Frame des textuell
direkt umschließenden Unterprogramms.

\end{slide}

\begin{slide}{Statische Ketten: Beispiel}

\small
\begin{minipage}{0.35\textwidth}
\begin{verbatim}
int f ( int x ) 
{
 int g ( int y ) 
 {
  int h ( int z ) 
  {
   return 
     x + y + z; 
  } 
  return 
    h (h (h (0))); 
 }    
 return g (g (0)); 
}      
\end{verbatim}
\end{minipage}%
\smash{\rule[-8cm]{1pt}{16cm}}%
\begin{minipage}{0.35\textwidth}
statische Kette benutzen
\begin{verbatim}
h.37:
pushl %ebp
movl %esp,%ebp
subl $24,%esp
movl %ecx,-4(%ebp)
movl -4(%ecx),%eax
movl -4(%eax),%edx
movl -8(%ecx),%eax
movl (%eax),%eax
addl (%edx),%eax
addl 8(%ebp),%eax
leave
ret
\end{verbatim}
\end{minipage}%
\smash{\rule[-8cm]{1pt}{16cm}}%
\begin{minipage}{0.35\textwidth}
Kette verlängern
\begin{verbatim}
g.33:
pushl %ebp
movl %esp,%ebp
subl $24,%esp
movl %ecx,-4(%ebp)
leal 8(%ebp),%eax
movl %eax,-8(%ebp)
addl $-12,%esp
addl $-12,%esp
addl $-12,%esp
pushl $0
movl %ebp,%ecx
call h.37
\end{verbatim} 
\end{minipage}%

\end{slide}
