diff --git a/verfahren.pdf b/verfahren.pdf index 508d76d..8647da9 100644 Binary files a/verfahren.pdf and b/verfahren.pdf differ diff --git a/verfahren.tex b/verfahren.tex index 5e83712..2eafe2e 100644 --- a/verfahren.tex +++ b/verfahren.tex @@ -238,6 +238,36 @@ \end{itemize} \subsubsection{Einfacher Code-Generator mit \texttt{getreg}} +\begin{itemize} + \item arbeitet auf maximalen Grundblöcken + \item alle Variablen vor und nach maximalem Grundblock im Speicher + \item Durchlaufen aller Zwischencode-Befehle und Mitführen von Register- und Adressdeskriptoren + \item \begin{equation*} + \texttt{getreg (}x \leftarrow y\, \texttt{op}\, z \texttt{)}= \begin{cases*} + R & falls $y$ alleine in $R$ steht und $y$ nicht mehr benötigt wird\\ + U & falls es unbenutztes Register $U$ gibt\\ + R & \parbox[t]{.65\textwidth}{falls $x$ in einem Register stehen muss/soll, schreibe Inhalt von $R$ in Speicherplätze aller darin enthaltenen Variablen}\\ + M_x & sonst + \end{cases*} + \end{equation*},\\ + dazu zusätzlich Deskriptoren anpassen + \item Für jeden Befehl $x \leftarrow y\, \texttt{op}\, z$:\begin{enumerate} + \item $L_x = \texttt{getreg (}x \leftarrow y\, \texttt{op}\, z \texttt{)}$ + \item Wähle $L_y$ aus Adressdeskriptor von $y$ (möglichst Register) + \item Falls $y$ noch nicht in $L_x$, generiere $L_x = L_y$ + \item Wähle Platz $L_z$ aus Adressdeskriptor von $z$ (möglichst Register) + \item Generiere $L_x = L_x\, \texttt{op}\, L_z$ + \item Deskriptoren aktualisieren:\begin{enumerate} + \item $L_x$ in Adressdeskriptor von $x$ eintragen + \item Falls $L_x$ Register, zugehörigen Registerdeskriptor aktualisieren + \end{enumerate} + \item Falls keine weitere Verwendung von $y$, $z$ im Grundblock und in Register,\begin{enumerate} + \item ggf. Werte in Speicher zurückschreiben + \item Register von $y$ bzw. $z$ freigeben + \item Deskriptoren aktualisieren + \end{enumerate} + \end{enumerate} +\end{itemize} \subsubsection{Sethi-Ullman-Algorithmus}