mirror of https://github.com/2martens/uni.git
154 lines
6.1 KiB
TeX
154 lines
6.1 KiB
TeX
\documentclass[10pt,a4paper,oneside,ngerman,numbers=noenddot]{scrartcl}
|
|
\usepackage[T1]{fontenc}
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage[ngerman]{babel}
|
|
\usepackage{amsmath}
|
|
\usepackage{amsfonts}
|
|
\usepackage{amssymb}
|
|
\usepackage{paralist}
|
|
\usepackage{qtree}
|
|
\usepackage[locale=DE,exponent-product=\cdot ,detect-all]{siunitx}
|
|
\usepackage{tikz}
|
|
\usepackage[scaled=0.78]{luximono}
|
|
\usepackage{listings}
|
|
\usepackage{subfigure}
|
|
\usetikzlibrary{automata,matrix,fadings,calc,positioning,decorations.pathreplacing,decorations.text,arrows}
|
|
\pagenumbering{arabic}
|
|
\def\thesection{12.\arabic{section})}
|
|
\def\thesubsection{(\alph{subsection})}
|
|
\def\thesubsubsection{(\arabic{subsubsection})}
|
|
\renewcommand{\labelenumi}{(\roman{enumi})}
|
|
\hyphenation{Nach-komma-stel-len}
|
|
\lstnewenvironment{java}[1][]{%
|
|
\lstset{basicstyle=\ttfamily ,backgroundcolor=\color[gray]{.95},columns=flexible,fontadjust=true,language=Java,tabsize=4,numbers=none,#1}%
|
|
}{%
|
|
}
|
|
\graphicspath{{D:/Users/Jim-Studium/Pictures/Studium/RS/}}
|
|
|
|
\tikzstyle{huffmanNodes}=[matrix of nodes,
|
|
nodes={circle,thin,draw=black!20,minimum size=10mm,text height=1.5ex,text depth=.25ex,inner sep=-10pt}]
|
|
\tikzstyle{huffmanBase}=[matrix of nodes,
|
|
nodes={minimum size=10mm,text height=1.5ex,text depth=.25ex,inner sep=-10pt}]
|
|
\begin{document}
|
|
\author{Jim Martens (Matrikelnummer 6420323) \and Marlo Kornblum (Matrikelnummer 6427301)}
|
|
\title{Rechnerstrukturen Aufgabenblatt 12}
|
|
\maketitle
|
|
|
|
\section{} %12.1
|
|
\subsection{} %a
|
|
Ziel: $0x100$ \\
|
|
Resultat in Ziel: $0x0000CB03$
|
|
\subsection{} %b
|
|
Ziel: $0x104$ \\
|
|
Resultat in Ziel: $0x000000BF$
|
|
\subsection{} %c
|
|
Ziel: $0x108$ \\
|
|
Resultat in Ziel: $0x00246000$
|
|
\subsection{} %d
|
|
Ziel: $0x10C$ \\
|
|
Resultat in Ziel: $0x00000043$
|
|
\subsection{} %e
|
|
Ziel: $\%ecx$ \\
|
|
Resultat in Ziel: $0x0000000B$
|
|
\subsection{} %f
|
|
Ziel: $\%eax$ \\
|
|
Resultat in Ziel: $0x000000FC$
|
|
\section{} %12.2
|
|
xorl $<Rb>, <Rb>$
|
|
\section{} %12.3
|
|
movl: $\%eip, \%eax$
|
|
\section{} %12.4
|
|
pushl $\%ebp$\\
|
|
movl $\%esp, \%ebp$ \\
|
|
movl $8(\%ebp), \%eax$ \\
|
|
subl $\$32, \%eax$ \\
|
|
imull $\$142, \%eax$ \\
|
|
movl $\%ebp, \%esp$ \\
|
|
popl $\%ebp$ \\
|
|
ret
|
|
\section{} %12.5
|
|
\subsection{} %a
|
|
Der Reihenfolge nach speichert das Assemblerprogramm zunächst das Register $\%ebx$ auf den Stack. Anschließend wird vom Register $\%esp$ die dezimale Konstante $24$ abgezogen und der neue Wert in $\%esp$ gespeichert. Nun wird der Inhalt, der ausgehend vom Wert von $\%esp$ plus einem Offset von $32$ im Stack steht, in das Register $\%ebx$ geschrieben. Im nächsten Schritt wird der Inhalt, der ausgehend vom Wert von $\%esp$ plus einem Offset von $36$ im Stack liegt, in das Register $\%edx$ kopiert.
|
|
|
|
In das Register $\%eax$ wird schließlich die Konstante $1$ gespeichert. Nun wird das Register $\%edx$ mit sich selbst verglichen. Dabei werden nur die Flags gesetzt, das Ergebnis selber wird jedoch verworfen. Das hier interessante (wegen dem nachfolgenden Jumpbefehl) Zero Flag wird gesetzt, wenn $\%edx$ gleich $0$ ist, ansonsten wird es nicht gesetzt.
|
|
|
|
In der darauffolgenden Zeile folgt ein Jumpbefehl, der nur ausgeführt wird, wenn das Zero Flag gesetzt ist. Falls dem so ist, wird zu L2 gesprungen.
|
|
|
|
Dort wird zum Inhalt des Registers $\%esp$ die dezimale Konstante $24$ hinzugezählt. Anschließend wird das oberste Element des Stacks in das Register $\%ebx$ gespeichert und der aktuelle Aufruf beendet.
|
|
|
|
Wenn nicht gesprungen wird, dann wird dieses hier ausgeführt:
|
|
|
|
Nun wird $1$ vom Inhalt von $\%edx$ subtrahiert. Anschließend wird der Inhalt von $\%edx$ an die Stelle geschrieben, die in $\%esp$ plus dem Offset von $4$ referenziert ist. Dann wird der Inhalt von $\%ebx$ an die Stelle geschrieben, die in $\%esp$ referenziert ist.
|
|
|
|
Jetzt ruft sich myst rekursiv erneut auf. Sobald bei einem Aufruf von myst das Register $\%edx$ gleich $0$ ist, wird der Aufruf beendet und abschließend in $\%eax$ das Produkt der Werte von $\%eax$ und $\%ebx$ geschrieben.
|
|
|
|
Damit wird das Unterprogramm beendet.
|
|
\subsection{} %b
|
|
Das Unterprogramm berechnet $5^{2}=25$. Allgemeiner wird $a^{b}$ berechnet.
|
|
\subsection{} %c
|
|
\begin{tikzpicture}
|
|
\draw (0, 0) -- +(2, 0);
|
|
\draw (0, 0.5) -- +(2, 0);
|
|
\draw (0, 1) -- +(2, 0);
|
|
\draw (0, 1.5) -- +(2, 0);
|
|
\draw (0, 2) -- +(2, 0);
|
|
\draw (0, 2.5) -- +(2, 0);
|
|
\draw (0, 3) -- +(2, 0);
|
|
\draw (0, 3.5) -- +(2, 0);
|
|
\draw (0, 4) -- +(2, 0);
|
|
\draw (0, 4.5) -- +(2, 0);
|
|
\draw (0, 5) -- +(2, 0);
|
|
\draw (0, 5.5) -- +(2, 0);
|
|
\draw (0, 6) -- +(2, 0);
|
|
\draw (0, 6.5) -- +(2, 0);
|
|
\draw (0, 7) -- +(2, 0);
|
|
\draw (0, 7.5) -- +(2, 0);
|
|
\draw (0, 8) -- +(2, 0);
|
|
\draw (0, 8.5) -- +(2, 0);
|
|
\draw (0, 9) -- +(2, 0);
|
|
\draw (0, 9.5) -- +(2, 0);
|
|
\draw (0, 10) -- +(2, 0);
|
|
\draw (0, 10.5) -- +(2, 0);
|
|
\draw (0, 11) -- +(2, 0);
|
|
\draw (0, 11.5) -- +(2, 0);
|
|
\draw (0, 12) -- +(2, 0);
|
|
\draw (0, 12.5) -- +(2, 0);
|
|
\draw (0, 13) -- +(2, 0);
|
|
%\draw (0, 13.5) -- +(2, 0);
|
|
\draw (0,0) -- +(0, 13.5);
|
|
\draw (2,0) -- +(0, 13.5);
|
|
|
|
\node (other) at (1, 13.25) {...};
|
|
\node (b1) at (1, 12.75) {b = 2};
|
|
\node (a1) at (1, 12.25) {a = 5};
|
|
\node (main) at (1, 11.75) {$\%eip$ main()};
|
|
\node (ebx1) at (1, 11.25) {$\%ebx \rightarrow ?$};
|
|
\node (other2) at (1, 10.75) {...};
|
|
\node (other3) at (1, 10.25) {...};
|
|
\node (other4) at (1, 9.75) {...};
|
|
\node (other5) at (1, 9.25) {...};
|
|
\node (b2) at (1, 8.75) {b = 1};
|
|
\node (a2) at (1, 8.25) {a = 5};
|
|
\node (myst1) at (1, 7.75) {$\%eip$ myst()};
|
|
\node (ebx2) at (1, 7.25) {$\%ebx \rightarrow 5$};
|
|
\node (other6) at (1, 6.75) {...};
|
|
\node (other7) at (1, 6.25) {...};
|
|
\node (other8) at (1, 5.75) {...};
|
|
\node (other9) at (1, 5.25) {...};
|
|
\node (b3) at (1, 4.75) {b = 0};
|
|
\node (a3) at (1, 4.25) {a = 5};
|
|
\node (myst2) at (1, 3.75) {$\%eip$ myst()};
|
|
\node (ebx3) at (1, 3.25) {$\%ebx \rightarrow 5$};
|
|
\node (other10) at (1, 2.75) {...};
|
|
\node (other11) at (1, 2.25) {...};
|
|
\node (other12) at (1, 1.75) {...};
|
|
\node (other13) at (1, 1.25) {...};
|
|
\node (other14) at (1, 0.75) {...};
|
|
\node (other15) at (1, 0.25) {...};
|
|
\node (esp) at (-0.75, 0.25) {$\%esp \rightarrow$};
|
|
\end{tikzpicture}
|
|
|
|
\subsection{} %d
|
|
Es würde eine Endlosschleife entstehen, da der zweite Parameter nie $0$ wird und damit nie die Sprungmarke L2 erreicht wird, wodurch nie ein Aufruf beendet würde und unendlich viele Rekursionsschritte durchgeführt würden.
|
|
\end{document}
|