Skip to content
Snippets Groups Projects
Select Git revision
  • 2023ss
  • 2024ss default
  • 2022ss
  • 2021ss protected
4 results

rtech-20230621.tex

Blame
  • rtech-20230621.tex 28.95 KiB
    % rtech-20230621.pdf - Lecture Slides on Computer Technology
    % Copyright (C) 2012, 2013, 2014, 2021, 2022, 2023  Peter Gerwinski
    %
    % This document is free software: you can redistribute it and/or
    % modify it either under the terms of the Creative Commons
    % Attribution-ShareAlike 3.0 License, or under the terms of the
    % GNU General Public License as published by the Free Software
    % Foundation, either version 3 of the License, or (at your option)
    % any later version.
    %
    % This document is distributed in the hope that it will be useful,
    % but WITHOUT ANY WARRANTY; without even the implied warranty of
    % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    % GNU General Public License for more details.
    %
    % You should have received a copy of the GNU General Public License
    % along with this document.  If not, see <http://www.gnu.org/licenses/>.
    %
    % You should have received a copy of the Creative Commons
    % Attribution-ShareAlike 3.0 Unported License along with this
    % document.  If not, see <http://creativecommons.org/licenses/>.
    
    % README: Dateiformate, Pipelining
    
    \documentclass[10pt,t]{beamer}
    
    \usepackage{pgslides}
    \usepackage{pdftricks}
    %\usepackage[obeyfamily=false,mathrm=mathsf,textrm=sffamily]{siunitx}
    %\usepackage{eurosym}
    \usepackage{tikz}
    
    \newcommand{\vfilll}{\vspace{0pt plus 1 filll}}
    
    \lstdefinestyle{asm}{basicstyle=\color{structure},
                         language={},
                         gobble=4}
    
    \begin{psinputs}
      \usepackage[utf8]{inputenc}
      \usepackage[german]{babel}
      \usepackage[T1]{fontenc}
      \usepackage{helvet}
      \renewcommand*\familydefault{\sfdefault}
      \usepackage{pstricks,pst-grad,pst-circ-pg}
      \newcommand{\invisible}{\tiny\color{white}}
      \psset{unit=1cm}
      \psset{logicLabelstyle=\invisible}
      \newcommand{\logicSymbol}{\small\boldmath\bf\rule{0pt}{0.5cm}}
      \psset{logicSymbolstyle=\logicSymbol}
      \newcommand{\Cin}{C\raisebox{-0.5ex}{\footnotesize in}}
      \newcommand{\Cout}{C\raisebox{-0.5ex}{\footnotesize out}}
    \end{psinputs}
    
    \title{Rechnertechnik}
    \author{Prof.\ Dr.\ rer.\ nat.\ Peter Gerwinski}
    \date{21.\ Juni 2023}
    
    \begin{document}
    
    \maketitleframe
    
    \nosectionnonumber{\inserttitle}
    
    \begin{frame}
    
      \shownosectionnonumber
    
      \begin{itemize}
        \item[\textbf{1}] \textbf{Einführung}
        \item[\textbf{2}] \textbf{Vom Schaltkreis zum Computer}
        \item[\textbf{3}] \textbf{Assembler-Programmierung}
        \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
          \begin{itemize}
            \item[4.1] Bit-Operationen
            \item[4.2] I/O-Ports
            \color{medgreen}
            \item[4.3] Interrupts
            \color{orange}
            \item[4.4] Byte-Reihenfolge -- Endianness
          \end{itemize}
        \item[\textbf{5}] \textbf{Dateiformate}
        \item[\textbf{6}] \textbf{Pipelining}
      \end{itemize}
    
    \end{frame}
    
    \setcounter{section}{3}
    \section{Hardwarenahe Programmierung}
    \setcounter{subsection}{2}
    \subsection{Interrupts}
    
    \begin{frame}[fragile]
    
      \showsubsection
    
      Externes Gerät ruft (per Stromsignal) Unterprogramm auf
    
      Zeiger hinterlegen: "`Interrupt-Vektor"'
    
      Beispiel: eingebaute Uhr\hfill
      \makebox(0,0)[tr]{%
        \only<1->{\begin{minipage}[t]{4.7cm}
            \vspace*{-0.3cm}%
            statt Zählschleife (\lstinline{_delay_ms}):\\
            Hauptprogramm kann\\
            andere Dinge tun
          \end{minipage}}%
        }
    
      \medskip
    
      \begin{lstlisting}
        #include <avr/interrupt.h>
    
        ...
    
    
        ISR (TIMER0B_COMP_vect)
        {
          PORTD ^= 0x40;
        }
      \end{lstlisting}
      \begin{picture}(0,0)
        \color{red}
        \put(1.9,3.1){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-1.4,-1.0);}}}
        \put(2.0,3.2){\makebox(0,0)[l]{"`Dies ist ein Interrupt-Handler."'}}
        \put(2.3,2.6){\makebox(0,0)[tr]{\tikz{\draw[-latex](0,0)--(-0.6,-0.55);}}}
        \put(2.4,2.6){\makebox(0,0)[l]{Interrupt-Vektor darauf zeigen lassen}}
      \end{picture}
    
      Initialisierung über spezielle Ports:
      \lstinline{TCCR0B}, \lstinline{TIMSK0}
    
      \bigskip
    
      \emph{Details: siehe Datenblatt und Schaltplan}
    
      \vspace*{-2.5cm}\hfill
      {\color{red}Herstellerspezifisch!}%
      \hspace*{1cm}
    
    \end{frame}
    
    \subsection{Byte-Reihenfolge -- Endianness}
    \subsubsection{Konzept}
    
    \begin{frame}[fragile]
    
      \showsubsection
      \showsubsubsection
    
      Eine Zahl geht über mehrere Speicherzellen.\\
      Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen
    
      \smallskip
    
      Welche Bits liegen wo?
    
    %  \pause
      \bigskip
    
      $1027 = 1024 + 2 + 1 = 0000\,0100\,0000\,0011_2 = 0403_{16}$
    
    %  \pause
      \bigskip
      Speicherzellen:
    
      \medskip
      \begin{tabular}{|c|c|l}\cline{1-2}
        \raisebox{-0.25ex}{04} & \raisebox{-0.25ex}{03} & \strut Big-Endian "`großes Ende zuerst"' \\\cline{1-2}
        \multicolumn{2}{c}{} & % \pause
          für Menschen leichter lesbar % \pause
          \\
        \multicolumn{3}{c}{} \\[-5pt]\cline{1-2}
        \raisebox{-0.25ex}{03} & \raisebox{-0.25ex}{04} & \strut Little-Endian "`kleines Ende zuerst"' \\\cline{1-2}
        \multicolumn{2}{c}{} & % \pause
          bei Additionen effizienter
      \end{tabular}
    
    %  \pause
      \medskip
      \textarrow\ Geschmackssache
    %  \pause\\
      \quad\textbf{\dots\ außer bei Datenaustausch!}
    
    %  \pause
    %  \bigskip
    %
    %  Aber: nicht verwechseln! \qquad $0304_{16} = 772$
    
    \end{frame}
    
    \begin{frame}
    
      \showsubsection
      \showsubsubsection
    
      Eine Zahl geht über mehrere Speicherzellen.\\
      Beispiel: 16-Bit-Zahl in 2 8-Bit-Speicherzellen
    
      \smallskip
    
      Welche Bits liegen wo?
    
      \medskip
    
      \textarrow\ Geschmackssache\\
      \textbf{\dots\ außer bei Datenaustausch!}
    
      \begin{itemize}
        \item
          Dateiformate
        \item
          Datenübertragung
      \end{itemize}
    
    \end{frame}
    
    \subsubsection{Dateiformate}
    
    \begin{frame}
    
      \showsubsection
      \showsubsubsection
    
      Audio-Formate: Reihenfolge der Bytes in 16- und 32-Bit-Zahlen
      \begin{itemize}
        \item
          RIFF-WAVE-Dateien (\file{.wav}): Little-Endian
        \item
          Au-Dateien (\file{.au}): Big-Endian
    %    \pause
        \item
          ältere AIFF-Dateien (\file{.aiff}): Big-Endian
        \item
          neuere AIFF-Dateien (\file{.aiff}): Little-Endian
      \end{itemize}
    
    %  \pause
      \bigskip
    
      Grafik-Formate: Reihenfolge der Bits in den Bytes
      \begin{itemize}
        \item
          PBM-Dateien: Big-Endian\only<1->{, MSB first}
        \item
          XBM-Dateien: Little-Endian\only<1->{, LSB first}
      \end{itemize}
      \only<1->{MSB/LSB = most/least significant bit}
    
    \end{frame}
    
    \subsubsection{Datenübertragung}
    
    \begin{frame}
    
      \showsubsection
      \showsubsubsection
    
      \begin{itemize}
        \item
          RS-232 (serielle Schnittstelle): LSB first
        \item
          I$^2$C: MSB first
        \item
          USB: beides
        \pause
        \medskip
        \item
          Ethernet: LSB first
        \item
          TCP/IP (Internet): Big-Endian
      \end{itemize}
    
    \end{frame}
    
    \begin{frame}[fragile]
    
      \showsubsection
    
      Frage: \emph{Für welche Zahl steht der Speicherinhalt\,
      \raisebox{2pt}{%
        \tabcolsep0.25em
        \begin{tabular}{|c|c|}\hline
          \rule{0pt}{11pt}a3 & 90 \\\hline
        \end{tabular}}
      (hexadezimal)?}
      
      \pause
      \smallskip
      Antwort: \emph{Das kommt darauf an.} ;--)
    
      \pause
      \medskip
      Little-Endian:
    
      \smallskip
    
      \begin{tabular}{lrl}
        als \lstinline,int8_t,: & $-93$ & (nur erstes Byte)\\
        als \lstinline,uint8_t,: & $163$ & (nur erstes Byte)\\
        als \lstinline,int16_t,: & $-28509$\\
        als \lstinline,uint16_t,: & $37027$\\
        \lstinline,int32_t, oder größer: & $37027$
          & (zusätzliche Bytes mit Nullen aufgefüllt)
      \end{tabular}
    
      \pause
      \medskip
      Big-Endian:
    
      \smallskip
    
      \begin{tabular}{lrl}
        als \lstinline,int8_t,:   & $-93$ & (nur erstes Byte)\\
        als \lstinline,uint8_t,:  & $163$ & (nur erstes Byte)\\
        als \lstinline,int16_t,:  & $-23664$\\
        als \lstinline,uint16_t,: & $41872$\\ als \lstinline,int32_t,:  & $-1550843904$ & (zusätzliche Bytes\\
        als \lstinline,uint32_t,: & $2744123392$  & mit Nullen aufgefüllt)\\
        als \lstinline,int64_t,:  & $-6660823848880963584$\\
        als \lstinline,uint64_t,: & $11785920224828588032$\\
      \end{tabular}
    
      \vspace*{-1cm}
    
    \end{frame}
    
    \section{Dateiformate}
    \subsection{Grafikdateien}
    \subsubsection{Pixelgrafik}
    
    \begin{frame}
    
      \showsection
      \showsubsection
      \showsubsubsection
    
      Jeden Bildpunkt einzeln abspeichern
      \begin{itemize}
        \item
          Farben als Zahlen abspeichern, z.\,B.\ Rot-, Grün- und Blauanteil\\
          verbreitet: jeweils 8 Bit pro Farbkanal
        \item
          Farben als Tabelle abspeichern:\\
          pro Bildpunkt ein Index für Tabelle, in der der Farbwert steht
        \item
          Speziell: nur 2 Farben (Vordergrund, Hintergrund)\\
          1 Bit pro Pixel
      \end{itemize}
    
      \medskip
    
      Kompression
      \begin{itemize}
        \item
          unkomprimiert: PBM, PGM, PPM, XBM
        \item
          verlustfrei: GIF, PNG (für Grafiken)
        \item
          verlustbehaftet: JPEG (für Fotos)
      \end{itemize}
    
      \vfilll
    
      \strut\hfill
      \begin{picture}(0,0)
        \put(0,0){\makebox(0,0)[br]{\includegraphics[height=1cm]{logo-hochschule-bochum.jpg}}}
        \put(0,1.5){\makebox(0,0)[br]{\includegraphics[height=1cm]{logo-hochschule-bochum.png}}}
      \end{picture}
    
    \end{frame}
    
    \subsubsection{Vektorgrafik}
    
    \begin{frame}
    
      \showsection
      \showsubsection
      \showsubsubsection
    
      Bildelemente über ihre Koordinaten abspeichern
      \begin{itemize}
        \item
          geeignet für Grafiken, normalerweise nicht für Fotos
        \item
          kleine Dateigrößen, skalierbar
      \end{itemize}
    
      \medskip
    
      Kompression
      \begin{itemize}
        \item
          unkomprimiert: PostScript, SVG
        \item
          komprimiert: PDF\\
          (kann auch PNG oder JPEG enthalten)
      \end{itemize}
    
      \vfilll
    
      \strut\hfill
      \begin{picture}(0,0)
        \put(0,0){\makebox(0,0)[br]{\includegraphics[height=1cm]{logo-hochschule-bochum.jpg}}}
        \put(0,1.5){\makebox(0,0)[br]{\includegraphics[height=1cm]{logo-hochschule-bochum.png}}}
        \put(0,3){\makebox(0,0)[br]{\includegraphics[height=1cm]{logo-hochschule-bochum.pdf}}}
      \end{picture}
    
    \end{frame}
    
    \subsection{Textdateien}
    
    \begin{frame}
      \showsection
      \showsubsection
    
      Zeichenkodierungen
      \begin{itemize}
        \item
          7 Bit: ASCII
        \item
          8 Bit: CP-437, CP-850, ISO 8859-1, ISO 8859-5, ISO 8859-15, \dots
        \item
          32 Bit: Unicode\\
          16-Bit-Kodierung: UTF-16\\
          8-Bit-Kodierung: UTF-8
        \item
          für URLs: Punycode
        \item
          historisch: Baudot-Code (5 Bit), EBCDIC (8 Bit)
      \end{itemize}
    
      \medskip
    
      Zeilentrennzeichen
      \begin{itemize}
        \item
          Unix: LF
        \item
          MS-DOS/Windows, HTTP: CR LF
        \item
          frühere Mac-Rechner: CR
      \end{itemize}
    
    \end{frame}
    
    \subsection{Archiv-Dateien}
    
    \begin{frame}
      \showsection
      \showsubsection
    
      \begin{itemize}\itemsep\medskipamount
        \item
          einzelne Datei, komprimiert:\\
          .gz, .bz2, .xz\\
          .ppm.xz-Dateien sind kleiner als .png-Dateien
        \item
          mehrere Dateien, zusammengefaßt:\\
          .a, .tar
        \item
          mehrere Dateien, zusammengefaßt und komprimiert:\\
          .tar.gz, .tar.bz2, .tar.xz, .zip, .7z
        \item
          Spezialfall: mehrere standardisierte Text-Dateien (XML)\\
          in standardisierter .zip-Datei:\\[\smallskipamount]
          OpenDocument (LibreOffice u.\,a.): .odt, .ods, .odp, \dots\\
          Office-Open-XML (Microsoft): .docx, .xlsx, .pptx, \dots
      \end{itemize}
    
    \end{frame}
    
    \subsection{Binärdateien}
    
    \begin{frame}
      \showsection
      \showsubsection
    
      \begin{itemize}
        \item
          Ein Programm speichert seine Speicherinhalte\\
          i.\,w.\ "`einfach so"' auf einem Datenträger.
        \arrowitem
          Bereits kleinste Versionsunterschiede führen zu Problemen.
        \item
          Beispiel: MS-Office-Dateien (.doc, .xls, .ppt)
        \item
          Besser: komprimierte Text-Dateien (.odt, .ods, .odp, .docx, .xlsx, .pptx)
      \end{itemize}
    
    \end{frame}
    
    \subsection{Ausführbare Dateien}
    
    \begin{frame}
    
      \visible<1->{\showsection\showsubsection}
    
      Man kann Maschinenprogramme nicht "`einfach so"' in den Speicher laden.
    
    %  \pause
      \bigskip
    
      Sprünge anpassen
      \begin{itemize}
        \item
          Relokation: Relokationstabelle
        \item
          Linken: Symboltabelle
      \end{itemize}
    
    \end{frame}
    
    \begin{frame}
    
      \showsubsection
    
      \vspace*{-0.5cm}
    
      \begin{center}
        \setlength{\unitlength}{0.8cm}
        \begin{picture}(15,6)(0,-1.25)
          \footnotesize
    
          \put(0,1.0){\line(1,0){15}}
          \multiput(0,1)(0.1,0){151}{\line(0,1){0.1}}
          \put(0,1.1){\line(1,0){15}}
          \put(0,0.8){\makebox(0,0)[tl]{Ausführbare Binärdatei}}
          \put(0.5,1.2){$\overbrace{\rule{1.0\unitlength}{0pt}}$}
          \put(2.0,1.2){$\overbrace{\rule{1.0\unitlength}{0pt}}$}
          \put(3.5,1.2){$\overbrace{\rule{11.5\unitlength}{0pt}}$}
    
          \put(0,4.0){\line(1,0){5}}
          \multiput(0,3.5)(0.5,0){11}{\line(0,1){0.5}}
          \put(0,3.5){\line(1,0){5}}
          \put(0,4.2){\makebox(0,0)[bl]{Relokationstabelle}}
          \put(1.0,3.4){\line(0,-1){1.9}}
          \put(3.75,3.4){\vector(1,-2){1.2}}
          \put(4.25,3.4){\vector(1,-1){2.4}}
          \put(4.75,3.4){\vector(2,-1){4.8}}
    
          \put(4.95,0.7){\line(0,1){0.25}}
          \put(4.95,0.7){\line(1,0){0.5}}
          \put(5.45,0.7){\vector(0,1){0.25}}
          \put(6.65,0.7){\line(0,1){0.25}}
          \put(6.65,0.7){\line(1,0){0.8}}
          \put(7.45,0.7){\vector(0,1){0.25}}
          \put(9.55,0.6){\line(0,1){0.35}}
          \put(9.55,0.6){\line(-1,0){3.2}}
          \put(6.35,0.6){\vector(0,1){0.35}}
          \put(7.25,0.4){\makebox(0,0)[t]{Sprünge innerhalb des Programms}}
    
          \put(6,4.0){\line(1,0){5}}
          \multiput(6,3.5)(0.5,0){11}{\line(0,1){0.5}}
          \put(6,3.5){\line(1,0){5}}
          \put(6,4.2){\makebox(0,0)[bl]{Symboltabelle}}
          \put(6.4,3.4){\line(-2,-1){3.8}}
          \put(10.25,3.4){\vector(1,-2){1.2}}
          \put(10.75,3.4){\vector(1,-1){2.4}}
    
          \put(9.25,1.55){\line(0,1){1}}
          \put(8.50,2.60){\makebox(0,0)[b]{Maschinenprogramm}}
    
          \put(11.45,0.95){\vector(0,-1){1}}
          \put(11.45,-0.10){\makebox(0,0)[t]{\lstinline{scanf}}}
          \put(13.15,0.95){\vector(0,-1){1}}
          \put(13.15,-0.10){\makebox(0,0)[t]{\lstinline{printf}}}
          \put(12.30,-0.50){\makebox(0,0)[t]{Sprünge aus dem Programm heraus}}
    
        \end{picture}
      \end{center}
    
      \vspace*{-1.2cm}
    
      \begin{onlyenv}<2>
    
        Ausführbare Binärdatei:
    
        \smallskip
    
        Relokationstabelle,\\
        Symboltabelle für dynamischen Linker
    
        \smallskip
    
        Formate: a.out, COFF, ELF, \dots\\
        Dateiendungen: (keine), .elf, .com, .exe, .scr
    
      \end{onlyenv}
    
      \begin{onlyenv}<3>
    
        Objektdatei:
    
        \smallskip
    
        Relokationstabelle,\\
        Symboltabellen für statischen und dynamischen Linker
    
        \smallskip
    
        Formate: a.out, COFF, ELF, \dots\\
        Dateiendungen: .o, .obj
    
      \end{onlyenv}
    
      \begin{onlyenv}<4->
    
        \strut\\
        Bibliothek:
    
        \smallskip
    
        Zusammenfassung mehrerer Objekt-Dateien
    
        \smallskip
    
        Statische Bibliotheken: .a, .lib\\
        Dynamische Bibliotheken: .so, .dll
    
      \end{onlyenv}
    
    \end{frame}
    
    \subsubsection{Die Toolchain}
    
    \begin{frame}[fragile]
    
      \showsubsection
      \showsubsubsection
    
      \vspace*{-1.5cm}
      \begin{center}
        \addtolength{\leftskip}{4cm}
        \small
        \newcommand{\vtextarrow}[1]{%
          \begin{picture}(0,0.8)
            \put(0,0.8){\vector(0,-1){0.8}}
            \put(0.125,0.4){\makebox(0,0)[l]{#1}}
          \end{picture}}
    
        \framebox{\shortstack{\strut menschliche Gedanken}}
    
        \vtextarrow{Texteditor}
    
        \framebox{\shortstack{\strut C-Quelltext}} % (z.\,B.\ hello.c)}}
    
        \vtextarrow{Compiler}
    
        \framebox{\shortstack{\strut Assembler-Quelltext}} % (z.\,B.\ hello.s, hello.asm)}}
    
        \vtextarrow{Assembler}
    
        \framebox{\shortstack{\strut Objekt- und Bibliothek-Dateien}} % (z.\,B.\ hello.o, hello.obj)}}
    
        \vtextarrow{Linker}
    
        \framebox{\shortstack{\strut ausführbare Binärdatei}} % (z.\,B.\ hello, hello.exe)}}
    
        \vtextarrow{Loader}
    
        \framebox{\shortstack{\strut Programm im Speicher bereit zur Ausführung}}
      \end{center}
    
    %  \pause
      \vspace*{-7cm}
      Automatischer Aufruf:
      \begin{itemize}
        \item
          Entwicklungsumgebungen\\
          (z.\,B.\ Eclipse, Code::Blocks, \dots)
        \medskip
        \item
          \file{gcc} = Compiler\\
          \hspace*{3em}+ Assembler\\
          \hspace*{3em}+ Linker\\
          \hspace*{3em}+ \dots
        \medskip
        \item
          \file{make} kann \emph{alles} aufrufen
      \end{itemize}
    
    \end{frame}
    
    \subsubsection{Besonderheiten von Mikrocontrollern}
    
    \begin{frame}
    
      \showsubsection
      \showsubsubsection
    
      Kein Betriebssystem\\ % \pause\\
      \textarrow\ kein Relocator, kein dynamischer Linker\\ % \pause\\
      \textarrow\ Wir müssen dem Mikrocontroller alles "`mundgerecht"' servieren.
    
    %  \pause
      \smallskip
    
      \begin{itemize}
        \item
          fertiges ROM: Hersteller
        \item
          Flash-Speicher und In-System Programmer (ISP)
        \item
          Flash-Speicher und Boot-Loader
      \end{itemize}
    
      \smallskip
    
      In jedem Fall: statisch linken, Relokation vorher
      \begin{picture}(0,0)
        \color{red}
        \put(0.1,0.1){\line(1,0){1.2}}
        \put(1.3,0.1){\vector(0,1){2.2}}
      \end{picture}\\
      \textarrow\ ELF-Datei in HEX-Datei umwandeln
    
      \smallskip
    
      Format: Intel-Hex-Format\\
      Dateiendung: .hex
    
    \end{frame}
    
    \section{Pipelining}
    \subsection{Konzept}
    
    \newcommand{\wm}{\raisebox{-0.3cm}{\includegraphics[width=1.0cm]{Waschen_30.pdf}}}
    \newcommand{\wt}{\raisebox{-0.3cm}{\includegraphics[width=1.0cm]{Trommeltrocknen.pdf}}}
    \newcommand{\be}{\raisebox{-0.3cm}{\includegraphics[width=1.0cm]{Buegeln.pdf}}}
    
    \begin{frame}
      \showsection
    
    %  \pause
      \showsubsection
      \begin{itemize}
        \item
          Aufgabe in Teilaufgaben zerlegen
        \item
          Teilaufgaben parallel ausführen
      \end{itemize}
    
      \pause
      \bigskip
      Beispiel: Wäsche waschen
    %  \pause
      \begin{itemize}
        \item
          Teilaufgaben: \wm, \wt, \be
        \pause
        \item
          müssen nacheinander ausgeführt werden\pause: Datenfluß
        \pause
        \item
          belegen jeweils 1 Ressource
      \end{itemize}
    
    \end{frame}
    
    \begin{frame}
    
      3 Ladungen Wäsche
      \begin{center}
        \begin{onlyenv}<1-2>
          \begin{picture}(12,3.5)
            \thicklines
            \put(1,1){\wm}
            \put(2,1){\wt}
            \put(3,1){\be}
            \put(4,2){\wm}
            \put(5,2){\wt}
            \put(6,2){\be}
            \put(7,3){\wm}
            \put(8,3){\wt}
            \put(9,3){\be}
            \put(-0.1,0.5){\vector(1,0){11.1}}
            \put(11.5,0.5){\makebox(0,0){$t$}}
            \put(10.5,1.0){\makebox(0,0)[r]{ineffizient}}
          \end{picture}\\[\medskipamount]
        \end{onlyenv}
        \begin{onlyenv}<2-4>
          \begin{picture}(12,3.5)
            \thicklines
            \put(1,1){\wm}
            \put(2,1){\wt}
            \put(3,1){\be}
            \put(2,2){\wm}
            \put(3,2){\wt}
            \put(4,2){\be}
            \put(3,3){\wm}
            \put(4,3){\wt}
            \put(5,3){\be}
            \put(-0.1,0.5){\vector(1,0){11.1}}
            \put(11.5,0.5){\makebox(0,0){$t$}}
            \put(10.5,1.0){\makebox(0,0)[r]{effizient}}
          \end{picture}\\[\medskipamount]
        \end{onlyenv}
        \begin{onlyenv}<3->
          \begin{picture}(12,3.5)
            \thicklines
            \put(1,1){\wm}
            \put(2,1){\wt}
            \put(3,1){\be}
            \put(1,2){\wm}
            \put(2,2){\wt}
            \put(3,2){\be}
            \put(1,3){\wm}
            \put(2,3){\wt}
            \put(3,3){\be}
            \put(-0.1,0.5){\vector(1,0){11.1}}
            \put(11.5,0.5){\makebox(0,0){$t$}}
            \put(10.5,1.0){\makebox(0,0)[r]{noch effizienter}}
            \color{red}
            \thicklines
            \put(0.5,0.8){\only<4->{\line(4,1){10}}}
            \put(0.5,3.3){\only<4->{\line(4,-1){10}}}
            \put(7.5,1.7){\only<4->{\mbox{\shortstack{Ressourcen-\\konflikt}}}}
          \end{picture}\\[\medskipamount]
        \end{onlyenv}
        \begin{onlyenv}<5->
          \begin{picture}(12,3.5)
            \thicklines
            \put(1,1){\wm}
            \put(2,1){\wt}
            \put(3,1){\be}
            \put(1,2){\wt}
            \put(2,2){\be}
            \put(3,2){\wm}
            \put(1,3){\be}
            \put(2,3){\wm}
            \put(3,3){\wt}
            \put(-0.1,0.5){\vector(1,0){11.1}}
            \put(11.5,0.5){\makebox(0,0){$t$}}
            \put(10.5,1.0){\makebox(0,0)[r]{noch effizienter}}
            \color{red}
            \thicklines
            \put(0.5,0.8){\only<6->{\line(4,1){10}}}
            \put(0.5,3.3){\only<6->{\line(4,-1){10}}}
            \put(7.5,1.7){\only<6->{\mbox{\shortstack{Daten-\\konflikt}}}}
          \end{picture}%
        \end{onlyenv}
      \end{center}
    
    \end{frame}
    
    \subsection{Arithmetik-Pipelines}
    
    \newcommand{\insns}[1]{%
      \begin{picture}(0,0)
        \put(0,0){\line(1,0){2}}
        \put(2,0){\line(0,-1){#1}}
        \put(2,-#1){\vector(-1,0){2}}
      \end{picture}}
    
    \newcommand{\insnsup}[1]{%
      \begin{picture}(0,0)
        \put(0,0){\line(1,0){2}}
        \put(2,0){\line(0,1){#1}}
        \put(2,#1){\vector(-1,0){2}}
      \end{picture}}
    
    \begin{frame}
    
      \showsubsection
      "`Register-FIFO"'
    
      \pause
      \smallskip
    
      Pseudo-Code: Berechnung von
      \begin{displaymath}
        S = \left(\begin{array}{c}a_1\\a_2\\a_3\end{array}\right)
        \cdot\left(\begin{array}{c}b_1\\b_2\\b_3\end{array}\right)
        = a_1 \cdot b_1
        + a_2 \cdot b_2
        + a_3 \cdot b_3
      \end{displaymath}
      mit einer Pipeline der Länge 3
    
      \pause
      \medskip
    
      \begingroup
        \setlength{\unitlength}{\baselineskip}%
        \begin{picture}(0,0)(-5.0,-0.25)
          \color{red}
          \put(0,0.0){\only<4->{\insns{3}}}
          \put(0.5,-1){\only<5->{\insns{2.9}}}
          \put(1.0,-2){\only<6->{\insns{3}}}
          \put(0.5,-4.1){\only<8->{\insns{2.8}}}
          \put(0.5,-7.1){\only<11->{\insns{2.9}}}
          \put(-1.5,-9.25){\only<15->{\shortstack{Daten-\\konflikt}}}
        \end{picture}%
        \color{structure}
        push $a_1 \cdot b_1$\\
        \pause
        \pause
        push $a_2 \cdot b_2$\\
        \pause
        push $a_3 \cdot b_3$\\
        \pause
        $s_1$ = pop\\
        \pause
        push $s_1 + \mbox{pop}$\\
        \pause
        $s_3$ = pop\\
        \pause
        nop\\
        \pause
        push $s_3 + \mbox{pop}$\\
        \pause
        nop\\
        \pause
        nop\\
        \pause
        $S$ = pop\\
      \endgroup
      \pause
      \pause
      \begin{picture}(0,0)
        \color{red}
        \put(5,3.8){\makebox(0,0)[l]{$\left.\rule{0pt}{1.2cm}\right\}$ effizient: Pipeline gefüllt}}
        \put(5,1.4){\makebox(0,0)[l]{$\left.\rule{0pt}{1.2cm}\right\}$ ineffizient: "`Blasen"'}}
      \end{picture}
      \pause
      \vspace*{-1.25cm}
      \begin{flushright}
        \dots\ aber immer noch effizienter als\\
        3 Schritte für jede Operation
      \end{flushright}
    
    \end{frame}
    
    \subsectionnonumber{Reales Beispiel: \break Vektor-Addition auf i860}
    
    \begin{frame}[fragile]
    
      \begin{minipage}[t]{5cm}
        \raggedright
        \showsubsectionnonumber
        \begin{lstlisting}
            .align 8
          .globl _vadd
            nop
          _vadd:
            shr 1,r19,r19
            bte r19,r0,exitadd
            addu 0x000F,r16,r16
            andnot 0x000F,r16,r16
            adds -16,r16,r16
            addu 0x000F,r17,r17
            andnot 0x000F,r17,r17
            adds -16,r17,r17
            addu 0x000F,r18,r18
            andnot 0x000F,r18,r18
            adds -16,r18,r18
            mov -1,r20
        \end{lstlisting}
      \end{minipage}
      \begin{minipage}[t]{5cm}
        \begin{lstlisting}
            fld.q 16(r16)++,f16
            fld.q 16(r17)++,f20
            pfadd.dd f16,f20,f0
            bla r20,r19,loopadd
            pfadd.dd f18,f22,f0
          loopadd:
            d.pfadd.dd f0,f0,f0
              fld.q 16(r16)++,f16
            d.pfadd.dd f0,f0,f24
              fld.q 16(r17)++,f20
            d.pfadd.dd f16,f20,f26
              bla r20,r19,loopadd
            d.pfadd.dd f18,f22,f0
              fst.q f24,16(r18)++
            nop
            nop
            nop
          exitadd:
            bri r1
            nop
        \end{lstlisting}
      \end{minipage}
    
    \end{frame}
    
    \lstdefinestyle{shybubble}{basicstyle=\color{lightgray},
                               moredelim=**[is][\color{structure}]{¡}{¿},
                               moredelim=**[is][\only<7->{\color{red}}]{°}{¿}}
    
    \begin{frame}[fragile]
    
      \begin{minipage}[t]{5cm}
        \raggedright
        \showsubsectionnonumber
        \begin{lstlisting}[style=shybubble]
            .align 8
          .globl _vadd
            nop
          _vadd:
            shr 1,r19,r19
            bte r19,r0,exitadd
            addu 0x000F,r16,r16
            andnot 0x000F,r16,r16
            adds -16,r16,r16
            addu 0x000F,r17,r17
            andnot 0x000F,r17,r17
            adds -16,r17,r17
            addu 0x000F,r18,r18
            andnot 0x000F,r18,r18
            adds -16,r18,r18
            mov -1,r20
        \end{lstlisting}
      \end{minipage}
      \begin{minipage}[t]{5cm}
        \begin{lstlisting}[style=shybubble]
            ¡fld.q 16(r16)++,f16
            fld.q 16(r17)++,f20
            pfadd.dd f16,f20,f0
            bla r20,r19,loopadd
            pfadd.dd f18,f22,f0
          loopadd:
            d.pfadd.dd °f0,f0,f0¿
              fld.q 16(r16)++,f16
            d.pfadd.dd °f0,f0¿,f24
              fld.q 16(r17)++,f20
            d.pfadd.dd f16,f20,f26
              bla r20,r19,loopadd
            d.pfadd.dd f18,f22,°f0¿
              fst.q f24,16(r18)++¿
            nop
            nop
            nop
          exitadd:
            bri r1
            nop
        \end{lstlisting}
      \end{minipage}
    
      \pause
      \begingroup
        \setlength{\unitlength}{\baselineskip}%
        \begin{picture}(0,0)(-21.0,-17.6)
          \color{red}
          \put(0,0){\only<2->{\insns{5.9}}}
          \put(1.0,-2){\only<3->{\insns{6.0}}}
          \put(-7,-9){\only<4->{\line(-1,0){1}}}
          \put(-8,-9){\only<4->{\line(0,-1){2}}}
          \put(-8,-11){\only<4->{\line(-1,0){1}}}
          \put(-9,-11){\only<4->{\line(0,1){8}}}
          \put(-9,-3){\only<4->{\vector(1,0){0.7}}}
          \put(0.8,-7.8){\only<5->{\insnsup{1.7}}}
          \put(0.8,-10){\only<6->{\insnsup{1.8}}}
          \put(-0.5,-12.5){\only<7->{\mbox{6mal f0 = 2 Blasen}}}
        \end{picture}%
      \endgroup
    
      \vspace{-2cm}
      \begin{flushright}
        \only<8->{Immerhin: 2 Additionen in 4 Taktzyklen}
    
        \medskip
    
        \only<9->{Dies ist ein \emph{einfaches} Beispiel.}
      \end{flushright}
      
    \end{frame}
    
    \subsection{Instruktions-Pipelines}
    
    \begin{frame}[fragile]
    
      \showsubsection
    
      Ein Prozessor benötigt Zeit, um einen Befehl zu verstehen.
    
      \textarrow\ Während Befehlsausführung nächste Befehle vorauslesen
    
      \medskip
    
      \begin{lstlisting}[style=shy]
        ².L3:
            movw r30,r20¿
            ³add r30,r18¿
            °adc r31,r19¿
            ¤mov r24,r18
            subi r24,lo8(-(1))
            st Z,r24
            subi r18,lo8(-(1))
            sbci r19,hi8(-(1))
            cp r22,r18
            cpc r23,r19¿
            ¢brge .L3¿
            æret¿
      \end{lstlisting}
    
      \begin{picture}(0,0)
        \color{red}
        \put(0.5,1.00){\only<8->{\line(-1,0){0.4}}}
        \put(0.1,1.00){\only<8->{\line(0,1){4.15}}}
        \put(0.1,5.15){\only<8->{\vector(1,0){0.4}}}
        \put(0.5,0.90){\only<9->{\line(-1,0){0.4}}}
        \put(0.1,0.90){\only<9->{\line(0,-1){0.35}}}
        \put(0.1,0.55){\only<9->{\vector(1,0){0.4}}}
        \put(2.5,0.825){\only<10->{\begin{minipage}[t]{8cm}
                                     bedingter Sprung:
                                     Welche Befehle vorauslesen?\\[\smallskipamount]
                                     \only<11->{Kontrollflußkonflikt}
                                   \end{minipage}}}
      \end{picture}
    
      \begin{flushright} 
        \vspace*{-0.5cm}
        \only<12->{Lösungsansatz: Zweigvorhersage}
        \vspace*{-1cm}
      \end{flushright}
      
    \end{frame}
    
    \subsubsectionnonumber{Zweigvorhersage -- Branch Prediction}
    
    \begin{frame}[fragile]
    
      \showsubsection
      \showsubsubsectionnonumber
    
      \begin{itemize}
        \setlength{\unitlength}{\baselineskip}%
        \pause
        \item
          Sprünge nach oben sind Schleifen: "`Ja"'\\
          Sprünge nach unten sind Auswahl-Verzweigungen: "`Nein"'
        \pause
        \item
          Delayed Branches: Sprungbefehl verspätet ausführen\\
          \textarrow\ Optimierung manuell oder durch Compiler
          \pause
          \medskip
          \begin{lstlisting}
            loopadd:
              d.pfadd.dd f0,f0,f0
                fld.q 16(r16)++,f16
              d.pfadd.dd f0,f0,f24
                fld.q 16(r17)++,f20
              d.pfadd.dd f16,f20,f26
                bla r20,r19,loopadd
              d.pfadd.dd f18,f22,f0
                fst.q f24,16(r18)++
          \end{lstlisting}
          \begin{picture}(0,0)(-9.6,-12.2)
            \color{red}
            \put(-7,-9){\line(-1,0){1}}
            \put(-8,-9){\line(0,-1){2}}
            \put(-8,-11){\line(-1,0){1}}
            \put(-9,-11){\line(0,1){8}}
            \put(-9,-3){\vector(1,0){0.7}}
          \end{picture}
        \pause
        \item
          Branch History Table: Sprünge merken
        \pause
        \item
          \dots
      \end{itemize}
    
    \end{frame}
    
    \subsectionnonumber{Zusammenfassung}
    
    \begin{frame}
    
      \showsection
      \showsubsectionnonumber
    
      \begin{itemize}
        \item
          Teilaufgaben parallel ausführen
        \item
          Arithmetik-Pipelines führen Berechnungen parallel aus,\\
          Instruktions-Pipelines lesen Befehle voraus
        \item
          Ressourcen-, Daten- und Kontrollflußkonflikte führen zu "`Blasen"'
        \item
          Zweigvorhersage reduziert Kontrollflußkonflikte in Instruktions-Pipelines
          \begin{itemize}
            \item
              nach oben / nach unten
            \item
              Delayed Branches: manuell optimieren
            \item
              Branch History Table: Sprünge merken
          \end{itemize}
      \end{itemize}
    
    \end{frame}
    
    \nosectionnonumber{\inserttitle}
    
    \begin{frame}
    
      \shownosectionnonumber
    
      \begin{itemize}
        \item[\textbf{1}] \textbf{Einführung}
        \item[\textbf{2}] \textbf{Vom Schaltkreis zum Computer}
        \item[\textbf{3}] \textbf{Assembler-Programmierung}
        \item[\textbf{4}] \textbf{Hardwarenahe Programmierung}
        \item[\textbf{5}] \textbf{Dateiformate}
          \begin{itemize}
            \color{medgreen}
            \item[5.1] Grafikdateien
            \item[5.2] Textdateien
            \item[5.3] Archiv-Dateien
            \item[5.4] Binärdateien
            \item[5.5] Ausführbare Dateien
          \end{itemize}
        \item[\textbf{6}] \textbf{Pipelining}
          \begin{itemize}
            \color{medgreen}
            \item[6.1]Konzept
            \item[6.2]Arithmetik-Pipelines
            \item[6.3]Instruktions-Pipelines
          \end{itemize}
      \end{itemize}
    
      \bigskip
    
      \hfill{\large\color{medgreen}\em Viel Erfolg bei der Klausur!}
    
    \end{frame}
    
    \end{document}