diff --git a/20230426/logo-hochschule-bochum-cvh-text-v2.pdf b/20230426/logo-hochschule-bochum-cvh-text-v2.pdf new file mode 120000 index 0000000000000000000000000000000000000000..4aa99b8f81061aca6dcaf43eed2d9efef40555f8 --- /dev/null +++ b/20230426/logo-hochschule-bochum-cvh-text-v2.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum-cvh-text-v2.pdf \ No newline at end of file diff --git a/20230426/logo-hochschule-bochum.pdf b/20230426/logo-hochschule-bochum.pdf new file mode 120000 index 0000000000000000000000000000000000000000..b6b9491e370e499c9276918182cdb82cb311bcd1 --- /dev/null +++ b/20230426/logo-hochschule-bochum.pdf @@ -0,0 +1 @@ +../common/logo-hochschule-bochum.pdf \ No newline at end of file diff --git a/20230426/pgslides.sty b/20230426/pgslides.sty new file mode 120000 index 0000000000000000000000000000000000000000..5be1416f4216f076aa268901f52a15d775e43f64 --- /dev/null +++ b/20230426/pgslides.sty @@ -0,0 +1 @@ +../common/pgslides.sty \ No newline at end of file diff --git a/20230426/rtech-20230426.pdf b/20230426/rtech-20230426.pdf new file mode 100644 index 0000000000000000000000000000000000000000..25e17719d8fa82f576e9eecc705f5e21ba72c39d Binary files /dev/null and b/20230426/rtech-20230426.pdf differ diff --git a/20230426/rtech-20230426.tex b/20230426/rtech-20230426.tex new file mode 100644 index 0000000000000000000000000000000000000000..368034f2f2290ec6775d3f84a6f3d38c7ac4525b --- /dev/null +++ b/20230426/rtech-20230426.tex @@ -0,0 +1,506 @@ +% rtech-20230426.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: Assembler-Programmierung + +\documentclass[10pt,t]{beamer} + +\usepackage{pgslides} +\usepackage{pdftricks} +%\usepackage[obeyfamily=false,mathrm=mathsf,textrm=sffamily]{siunitx} +%\usepackage{eurosym} +\usepackage{tikz} + +\newcommand{\Cin}{C\raisebox{-0.5ex}{\footnotesize in}} +\newcommand{\Cout}{C\raisebox{-0.5ex}{\footnotesize out}} + +\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{26.\ April 2022} + +\begin{document} + +\maketitleframe + +\nosectionnonumber{\inserttitle} + +\begin{frame} + + \shownosectionnonumber + + \begin{itemize} + \item[\textbf{1}] \textbf{Einführung} + \item[\textbf{2}] \textbf{Vom Schaltkreis zum Computer} + \begin{itemize} + \item[2.1] Logik-Schaltkreise + \item[2.2] Binärdarstellung von Zahlen + \item[2.3] Vom Logik-Schaltkreis zum Addierer + \item[2.4] Negative Zahlen + \item[2.5] Weitere Rechenoperationen + \item[2.6] Vom Addierer zum Computer + \end{itemize} + \item[\textbf{3}] \textbf{Assember-Programmierung} + \begin{itemize} + \color{medgreen} + \item[3.1] Struktur von Assembler-Programmen + \color{red} + \item[3.2] Beispiel: Redcode + \item[\dots] + \end{itemize} +% \color{gray} +% \item[\textbf{3}] \textbf{Architekturmerkmale von Prozessoren} +% \item[\textbf{4}] \textbf{Der CPU-Stack} +% \item[\textbf{5}] \textbf{Hardwarenahe Programmierung} +% \item[\textbf{6}] \textbf{Anwender-Software} +% \item[\textbf{7}] \textbf{Bus-Systeme} +% \item[\textbf{8}] \textbf{Pipelining} +% \item[\textbf{9}] \textbf{Ausblick} + \item[\textbf{\dots\hspace{-0.75em}}] + \end{itemize} + +\end{frame} + +\setcounter{section}{2} +\section{Assembler-Programmierung} +\subsection{Struktur von Assembler-Programmen} + +\begin{frame} + \showsection + \showsubsection + + \textbf{Maschinensprache:} Bits besagen, was in diesem Takt geschehen soll + + \begin{itemize} + \item + \textbf{arithmetisch-logische Befehle:}\\[\smallskipamount] + Daten aus Registern (oder Hauptspeicher) an ALU legen,\\ + Ergebnis in Register (oder Hauptspeicher) schreiben + \item + \textbf{Lade- und Speicher-Befehle:}\\[\smallskipamount] + Daten aus dem Hauptspeicher in Register einlesen\\ + oder aus Register in den Hauptspeicher schreiben + \item + \textbf{(unbedingter) Sprungbefehl:}\\[\smallskipamount] + Daten aus Register oder Hauptspeicher in das \lstinline{IP}-Register laden + \item + \textbf{(bedingter) Sprungbefehl:}\\[\smallskipamount] + Sprungbefehl nur dann, wenn im Status-Ausgang der ALU\\ + ein bestimmtes Bit gesetzt ist + \bigskip + \arrowitem + Der Computer kann "`alles"' -- \newterm{Turing-Vollständigkeit} + \end{itemize} +\end{frame} + +\begin{frame} + + \showsection + \showsubsection + + \textbf{Maschinensprache:} Bits besagen, was in diesem Takt geschehen soll + \begin{itemize} + \item + Lade- und Speicher-Befehle\\ + arithmetisch-logische Befehle\\ + unbedingte und bedingte Sprungbefehle + \arrowitem + Der Computer kann "`alles"' -- \newterm{Turing-Vollständigkeit} + \end{itemize} + + \medskip + + \textbf{\newterm{Assembler\/}-Sprache} + \begin{itemize} + \item + Maschinensprache = Zahlen \textarrow\ für Menschen schwer handhabbar + \arrowitem + Namen für die Befehle: \newterm{Mnemonics} + \end{itemize} + + \pause + \medskip + + \textbf{Beispiele} + \begin{itemize} + \item + Intel 8086 \textcolor{red}{(emulierter 16-Bit-Rechner)} + \item + Atmel AVR \textcolor{red}{(Arduino, 8 Bit)} + \item + Intel IA-32 / AMD64 \textcolor{red}{(Notebook-PC, 64 Bit)} + \item + Redcode \textcolor{red}{(emulierter Rechner, Praktikumsversuch)} + \end{itemize} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + Beispiel: IA-32-Assembler + \only<2>{-- \newterm{Befehl (Opcode)}}% + \only<3>{-- \newterm{Befehl (Opcode)} und \newterm{Operanden}}% + \only<4>{-- \newterm{Adressierungsarten}} + + \vspace{2cm} + + \begin{lstlisting} + addl $1, %eax + movb %al, b + cmpb (%ebx), %dl + jbe .L2 + \end{lstlisting} + + \begin{onlyenv}<2-3> + \begin{picture}(0,0) + \color{red} + \put(0.4,2.8){\vector(0,-1){0.7}} + \put(0.4,2.9){\makebox(0,0)[b]{Befehl}} + \only<2>{% + \put(1.4,2.8){\vector(-1,-1){0.7}} + \put(2.3,2.9){\makebox(0,0)[b]{Größen-Suffix}}} + \only<3>{% + \put(1.4,2.8){\vector(-1,-2){0.35}} + \put(1.4,2.8){\vector(1,-2){0.35}} + \put(2.0,2.9){\makebox(0,0)[b]{Operanden}}} + \end{picture} + \end{onlyenv} + \begin{onlyenv}<4> + \begin{picture}(0,0) + \color{red} + \put(1.4,2.8){\vector(-1,-2){0.35}} + \put(2.0,2.9){\makebox(0,0)[b]{unmittelbar}} + \put(3.0,1.8){\vector(-1,0){0.7}} + \put(3.1,1.8){\makebox(0,0)[l]{Register}} + \put(4.8,1.4){\vector(-1,0){2.7}} + \put(4.9,1.4){\makebox(0,0)[l]{Speicher (absolut)}} + \put(2.3,-0.0){\vector(-1,1){0.7}} + \put(3.5,-0.1){\makebox(0,0)[t]{indirekt mit Register}} + \put(0.8,-0.6){\vector(0,1){0.9}} + \put(0.0,-0.7){\makebox(0,0)[tl]{Speicher (relativ)}} + \end{picture} + \end{onlyenv} + +\end{frame} + +\subsection{Beispiel: Redcode} + +\begin{frame}[fragile] + + \showsubsection + + Beispiel: Redcode (ICWS '86) -- Core War[s] (Krieg der Kerne)\\ + Virtuelle Maschine: Memory Array Redcode Simulator (MARS) + + \bigskip + + \begin{minipage}[t]{7.2cm} + Instruktionen:\\[\smallskipamount] + \lstinline{dat B} -- Daten \only<1->{-- "`Du hast verloren!"'}\\ + \lstinline{mov A, B} -- kopiere A nach B\\ + \lstinline{add A, B} -- addiere A zu B\\ + \lstinline{sub A, B} -- subtrahiere A von B\\ + \lstinline{jmp A} -- unbedingter Sprung nach A\\ + \lstinline{jmz A, B} -- Sprung nach A, wenn B $=$ 0\\ + \lstinline{jmn A, B} -- Sprung nach A, wenn B $\ne$ 0\\ + \lstinline{djn A, B} -- "`decrement and jump if not zero"'\\ + \lstinline{cmp A, B} -- "`compare"': überspringe, falls gleich\\ + \lstinline{spl A} -- "`split"': Programm verzweigen + \end{minipage}\hfill + \begin{minipage}[t]{4.7cm} + Adressierungsarten:\\[\smallskipamount] + grundsätzlich: Speicher relativ\\[\smallskipamount] + \lstinline{#} -- unmittelbar\\ + \lstinline{$} -- direkt\\ + \lstinline{@} -- indirekt\\ + \lstinline{<} -- indirekt mit Prä-Dekrement + +% \pause[5] + \bigskip + Programm "`Nothing"': + \begin{lstlisting}[gobble=6] + jmp 0 + \end{lstlisting} +% \pause + \bigskip + Programm "`Knirps"': + \begin{lstlisting}[gobble=6] + mov 0, 1 + \end{lstlisting} + + \end{minipage} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + Unbedingte Verzweigung + + Beispiel: Endlosschleife von "`Dwarf"' + + \begin{minipage}[t]{1.2cm} + \begin{lstlisting}[style=asm,gobble=6] + bomb + start + \end{lstlisting} + \end{minipage}% + \begin{minipage}[t]{3cm} + \begin{lstlisting}[style=asm,gobble=6] + dat #0 + add #4, bomb + mov bomb, @bomb + jmp start + end start + \end{lstlisting} + \end{minipage}\hfill + \begin{minipage}[t]{3.9cm} + \small + \bigskip + Instruktionen:\\[\smallskipamount] + \lstinline{dat B}\\ + \lstinline{mov A, B}\\ + \lstinline{add A, B}\\ + \lstinline{sub A, B}\\ + \lstinline{jmp A}\\ + \lstinline{jmz A, B} -- "`jump if zero"'\\ + \lstinline{jmn A, B} -- "`if not zero"'\\ + \lstinline{djn A, B} -- "`dec. \& jmn"'\\ + \lstinline{cmp A, B} -- vgl.\ \& überspr.\\ + \lstinline{spl A} -- verzweigen + \end{minipage}% + \begin{minipage}[t]{2.7cm} + \small + \bigskip + Adressierungsarten:\\[\medskipamount] + grundsätzlich:\\ + Speicher relativ\\[\medskipamount] + \lstinline{#} -- unmittelbar\\[\smallskipamount] + \lstinline{$} -- direkt\\[\smallskipamount] + \lstinline{@} -- indirekt\\[\smallskipamount] + \lstinline{<} -- indirekt mit\\ + \hspace*{0.52cm}Prä-Decrement + \end{minipage} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + \alt<2->{Mehrere Threads}{Bedingte Verzweigung} + + Beispiel: \alt<2->{Multithreading}{Kopierschleife} von "`Mice"' + + \begin{minipage}[t]{1.2cm} + \begin{lstlisting}[style=asm,gobble=6] + ptr + start + loop + + + + + dest + + \end{lstlisting} + \end{minipage}% + \begin{minipage}[t]{3cm} + \begin{lstlisting}[style=asm,gobble=6] + dat #0 + mov #12, ptr + mov @ptr, <dest + djn loop, ptr + spl @dest + add #653, dest + jmz start, ptr + dat #833 + end start + \end{lstlisting} + \end{minipage}\hfill + \begin{minipage}[t]{3.9cm} + \small + \bigskip + Instruktionen:\\[\smallskipamount] + \lstinline{dat B}\\ + \lstinline{mov A, B}\\ + \lstinline{add A, B}\\ + \lstinline{sub A, B}\\ + \lstinline{jmp A}\\ + \lstinline{jmz A, B} -- "`jump if zero"'\\ + \lstinline{jmn A, B} -- "`if not zero"'\\ + \lstinline{djn A, B} -- "`dec. \& jmn"'\\ + \lstinline{cmp A, B} -- vgl.\ \& überspr.\\ + \lstinline{spl A} -- verzweigen + \end{minipage}% + \begin{minipage}[t]{2.7cm} + \small + \bigskip + Adressierungsarten:\\[\medskipamount] + grundsätzlich:\\ + Speicher relativ\\[\medskipamount] + \lstinline{#} -- unmittelbar\\[\smallskipamount] + \lstinline{$} -- direkt\\[\smallskipamount] + \lstinline{@} -- indirekt\\[\smallskipamount] + \lstinline{<} -- indirekt mit\\ + \hspace*{0.52cm}Prä-Decrement + \end{minipage} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + Selbstmodifizierender Code + + Beispiel: Selbsterkennung von "`Fini"' + + \begin{minipage}[t]{1.2cm} + \begin{lstlisting}[language={},gobble=6] + num + start + + pos + + \end{lstlisting} + \end{minipage}% + \begin{minipage}[t]{0.9cm} + \begin{lstlisting}[language={},gobble=6] + dat #-2 + mov num, <pos + jmp start + dat #-3 + end start + \end{lstlisting} + \end{minipage}\hfill + \begin{minipage}[t]{3.9cm} + \small + \bigskip + Instruktionen:\\[\smallskipamount] + \lstinline{dat B}\\ + \lstinline{mov A, B}\\ + \lstinline{add A, B}\\ + \lstinline{sub A, B}\\ + \lstinline{jmp A}\\ + \lstinline{jmz A, B} -- "`jump if zero"'\\ + \lstinline{jmn A, B} -- "`if not zero"'\\ + \lstinline{djn A, B} -- "`dec. \& jmn"'\\ + \lstinline{cmp A, B} -- vgl.\ \& überspr.\\ + \lstinline{spl A} -- verzweigen + \end{minipage}% + \begin{minipage}[t]{2.7cm} + \small + \bigskip + Adressierungsarten:\\[\medskipamount] + grundsätzlich:\\ + Speicher relativ\\[\medskipamount] + \lstinline{#} -- unmittelbar\\[\smallskipamount] + \lstinline{$} -- direkt\\[\smallskipamount] + \lstinline{@} -- indirekt\\[\smallskipamount] + \lstinline{<} -- indirekt mit\\ + \hspace*{0.52cm}Prä-Decrement + \end{minipage} + +\end{frame} + +\begin{frame}[fragile] + + \showsubsection + + \strut + + \strut\makebox(0,0)[bl]{\large\color{structure}\textbf{Praktikumsversuch}} + + \begin{minipage}[t]{5cm} + \medskip + Schreiben Sie ein\\ + Redcode-Programm,\\ + das die Gegner\\ + \file{Nothing}, \file{Knirps}\\ + und \file{Mice} besiegt. + + \medskip + + ICWS-86-Standard,\\ + max.\ 64 Prozesse,\\ + Speichergröße zufällig\\ + von 512 bis 8192 + + \medskip + + Teams bis zu 3 Personen\\ + sind zulässig. + \end{minipage}\hfill + \begin{minipage}[t]{3.9cm} + \small + \bigskip + Instruktionen:\\[\smallskipamount] + \lstinline{dat B}\\ + \lstinline{mov A, B}\\ + \lstinline{add A, B}\\ + \lstinline{sub A, B}\\ + \lstinline{jmp A}\\ + \lstinline{jmz A, B} -- "`jump if zero"'\\ + \lstinline{jmn A, B} -- "`if not zero"'\\ + \lstinline{djn A, B} -- "`dec. \& jmn"'\\ + \lstinline{cmp A, B} -- vgl.\ \& überspr.\\ + \lstinline{spl A} -- verzweigen + \end{minipage}% + \begin{minipage}[t]{2.7cm} + \small + \bigskip + Adressierungsarten:\\[\medskipamount] + grundsätzlich:\\ + Speicher relativ\\[\medskipamount] + \lstinline{#} -- unmittelbar\\[\smallskipamount] + \lstinline{$} -- direkt\\[\smallskipamount] + \lstinline{@} -- indirekt\\[\smallskipamount] + \lstinline{<} -- indirekt mit\\ + \hspace*{0.52cm}Prä-Decrement + \end{minipage} + +\end{frame} + +\end{document} diff --git a/20230502/scores b/20230502/scores new file mode 100755 index 0000000000000000000000000000000000000000..147b503a39376b29b4146b82210f79dcde2af262 --- /dev/null +++ b/20230502/scores @@ -0,0 +1,11 @@ +#!/bin/bash + +echo "score wins draws" +for x in *.score; do + printf "%4d %4d %4d %-15s\n" \ + $(wc -c "$x" | sed -e 's/ .*$//') \ + $(( $(grep -o "\*" "$x" | wc -l) / 3 )) \ + $(grep -o "+" "$x" | wc -l) \ + $(basename $x .red.score) +done \ + | sort -rn diff --git a/20230502/tournament b/20230502/tournament new file mode 100755 index 0000000000000000000000000000000000000000..9e5b2aa3bc8e4816ff1b7332a3aa0f941e019015 --- /dev/null +++ b/20230502/tournament @@ -0,0 +1,48 @@ +#!/bin/bash + +if [ "$1" = "-s" ]; then + core_size="$2" + shift 2 +fi + +if [ -n "$1" ]; then + PARTICIPANTS="$@" +else + PARTICIPANTS=$(ls *.red) +fi + +#PARTICIPANTS="nothing.red knirps.red mice.red $1" + +PMARS="$HOME/bo/2012ws/rtech/material/pmars-0.9.2/src/pmars-ncurses" + +mars () +{ + c1=$2 + c2=$3 + if [ -n "$core_size" ]; then + set $($PMARS -8 -b -k -p 64 -s $core_size $2 $3) + else + set $($PMARS -8 -b -k -p 64 -s $1 $2 $3) + fi + if [ $1 = 1 ]; then + echo -n "***" >> $c1.score + touch $c2.score + elif [ $3 = 1 ]; then + touch $c1.score + echo -n "***" >> $c2.score + else + echo -n "+" >> $c1.score + echo -n "+" >> $c2.score + fi +} + +rm -f *.score + +./turn $PARTICIPANTS \ + | sort -R \ + | tee tournament.log \ + | while read line; do + $line + done + +./scores diff --git a/20230502/turn.c b/20230502/turn.c new file mode 100644 index 0000000000000000000000000000000000000000..4fbaf4f9401c9159892243ff68df89d46660389d --- /dev/null +++ b/20230502/turn.c @@ -0,0 +1,13 @@ +#include <stdio.h> +#include <stdlib.h> + +int main (int argc, char **argv) +{ + srand (42); + for (char **p = argv + 1; *p; p++) + for (char **q = p + 1; *q; q++) + for (int i = 0; i < 100; i++) + printf ("mars %d %s %s\n", + 512 + rand () % (8192 - 512 + 1), *p, *q); + return 0; +}