From: Mart Lubbers Date: Thu, 15 May 2014 20:56:11 +0000 (+0200) Subject: variabelen opslag klaar X-Git-Url: https://git.martlubbers.net/?a=commitdiff_plain;h=9a1de09879a1618ea600a19c0ddaaaa05489f4dc;p=sec1415.git variabelen opslag klaar --- diff --git a/an_variabelen.tex b/an_variabelen.tex index 9e46b6b..ae9268d 100644 --- a/an_variabelen.tex +++ b/an_variabelen.tex @@ -1,16 +1,65 @@ \subsection{Variabelen} -Variabelen in \textit{While} worden op een totaal andere manier opgeslagen in -\textit{Piet}. Waar variabelen in while een naam hebben, hebben variabelen in -\textit{Piet} een nummer en kunnen ze door het aanroepen van een functie -bovenaan gezet worden. De functie kan precies $1$ of precies $2$ variabelen -boven aan de stack zetten. Hetzelfde kan voor de variabelen posities $a$ en $b$ -waarbij $b>a$. De piet' code om de variabele boven aan te krijgen is dan als -volgt: $push b-1, push b-a, roll, push b, push b, push b*2, sub, roll$.\\ -Allereerst wordt $b-1$ op de stack gedrukt, dit bepaalt de diepte van de eerste -$roll$ en zorgt ervoor dat $a$ tegen $b$ aan komt te liggen. $b-a$ wordt dat op -de stack gepushed, dit is het verschil tussen $a$ en $b$ en bepaalt het aantal -rolls er gedaan wordt op de stack, dit zijn er precies genoeg om $a$ bij $b$ te -plaatsen. Vervolgens moeten ze nog naar boven en dat kan door $-b+1$ stappen te -rollen met een diepte van $b$. de eerste $push b$ bepaalt de diepje en -vervolgens wordt met $push b, push b*2-1, sub$ $b-1$ op de stack gepushed om te -rollen en $a$ en $b$ bovenaan te plaatsen. +\subsubsection{Verschil met \textit{While}} +Omdat \textit{Piet} geen variabelen opslag kent moeten we de variabelenopslag +van \textit{While} emuleren. Dit wordt gedaan door steeds een diepte toe te +kennen aan variabelen en bij het assignen van een variabele wordt deze in de +stack gestopt en onthouden welke diepte hij heeft om het zo via de onderstaande +algorithmen op te kunnen rakelen. Binnen de algorithmen wordt $n$ gebruikt als +diepte van de variabele(beginnende bij $1$) en $m$ als het aantal variabelen op +de stack bij aanvang van het opvragen. + +\subsubsection{Unair} +Als er een operator uitgevoerd wordt die slechts \'e\'en waarde vraagt van de +stack hoeft er slechts \'e\'en waarde boven aan de stack gezet te worden en dit +gaat met de volgende operaties:\\ +push $n$, push $n-1$, roll, dup, push $n+1$, push $1$, roll\\ +\begin{table}[h] + \centering + \caption{Voorbeeld, $n=3$} + \scriptsize + \begin{tabular}{|c|c|c|c|c|c|c|c|} + \hline + init & + push $3$ & push $3-1$ & roll & dup & push $3+1$ & push $1$ & roll\\ + \hline + 5 & 3 & 2 & 2 & 2 & 4 & 1 & 2 \\\hline + 6 & 5 & 3 & 5 & 2 & 2 & 4 & 5 \\\hline + 2 & 6 & 5 & 6 & 5 & 2 & 2 & 6 \\\hline + 1 & 2 & 6 & 1 & 6 & 5 & 2 & 2 \\\hline + 3 & 1 & 2 & 3 & 1 & 6 & 5 & 1 \\\hline + & 3 & 1 & & 3 & 1 & 6 & 3 \\\hline + & & 3 & & & 3 & 1 & \\\hline + & & & & & & 3 & \\\hline + \end{tabular} +\end{table}\\ +Dit algorithme beschrijven we als $Un(n)$ voor later gebruik. + +\subsubsection{Binair} +Als er een operator uitgevoerd wordt die twee waardes vraagt van de stack +worden deze boven elkaar boven op de stack gekopieert met de volgende +operaties:\\ +$Un(n_1), Un(n_2+1)$\\ +Voorbeeld, $n_1=2, n_2=4$\\ +\begin{table}[h] + \centering + \caption{Voorbeeld, $n_1=2, n_2=4$} + \scriptsize + \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|} + \hline + & \multicolumn{7}{c|}{$Un(2)$} & \multicolumn{7}{c|}{$Un(4+1)$}\\ + \hline + init & + push $2$ & push $3$ & roll & dup & push $3$ & push $1$ & roll & + push $5$ & push $4$ & roll & dup & push $6$ & push $1$ & roll\\ + \hline + 5 & 2 & 3 & 6 & 6 & 3 & 1 & 6 & 5 & 4 & 1 & 1 & 6 & 1 & 1 \\\hline + 6 & 5 & 2 & 5 & 6 & 6 & 3 & 5 & 6 & 5 & 6 & 1 & 1 & 6 & 6 \\\hline + 2 & 6 & 5 & 2 & 5 & 6 & 6 & 6 & 5 & 6 & 5 & 6 & 1 & 1 & 5 \\\hline + 1 & 2 & 6 & 1 & 2 & 5 & 6 & 2 & 6 & 5 & 6 & 5 & 6 & 1 & 6 \\\hline + 3 & 1 & 2 & 3 & 1 & 2 & 5 & 1 & 2 & 6 & 2 & 6 & 5 & 6 & 2 \\\hline + & 3 & 1 & & 3 & 1 & 2 & 3 & 1 & 2 & 3 & 2 & 6 & 5 & 1 \\\hline + & & 3 & & & 3 & 1 & & 3 & 1 & & 3 & 2 & 6 & 3 \\\hline + & & & & & & 3 & & & 3 & & & 3 & 2 & \\\hline + & & & & & & & & & & & & & 3 & \\\hline + \end{tabular} +\end{table}