Skip to content
Snippets Groups Projects
Commit 755aaa08 authored by Peter Gerwinski's avatar Peter Gerwinski
Browse files

Redcode: "Turnier"-Software

parent 91f97913
Branches
No related tags found
No related merge requests found
../common/logo-hochschule-bochum-cvh-text-v2.pdf
\ No newline at end of file
../common/logo-hochschule-bochum.pdf
\ No newline at end of file
../common/pgslides.sty
\ No newline at end of file
File added
% 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}
#!/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
#!/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
#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;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment