Einfacher Code-Generator mit getreg

This commit is contained in:
Marco Ammon 2020-06-26 11:59:24 +02:00
parent 2748a80fed
commit 16f83b0f0f
2 changed files with 30 additions and 0 deletions

Binary file not shown.

View File

@ -238,6 +238,36 @@
\end{itemize} \end{itemize}
\subsubsection{Einfacher Code-Generator mit \texttt{getreg}} \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} \subsubsection{Sethi-Ullman-Algorithmus}