From 29c53e6a896e3472718efcf8a0c6fc486fc9bbf2 Mon Sep 17 00:00:00 2001 From: Peter Gerwinski <peter.gerwinski@hs-bochum.de> Date: Tue, 17 May 2022 14:57:54 +0200 Subject: [PATCH] Notizen und Beispiel-Programme 17.5.2022 --- 20220517/catcan2.red | 21 ++++ 20220517/knirps.red | 5 + 20220517/mice.red | 16 +++ 20220517/nothing.red | 5 + 20220517/rtech-20220517.txt | 243 ++++++++++++++++++++++++++++++++++++ 20220517/sk.red | 8 ++ 20220517/test-01.red | 1 + 20220517/test-02.red | 9 ++ 20220517/test-03.red | 10 ++ 20220517/test-04.red | 10 ++ 20220517/test-05.red | 12 ++ 11 files changed, 340 insertions(+) create mode 100644 20220517/catcan2.red create mode 100644 20220517/knirps.red create mode 100644 20220517/mice.red create mode 100644 20220517/nothing.red create mode 100644 20220517/rtech-20220517.txt create mode 100644 20220517/sk.red create mode 100644 20220517/test-01.red create mode 100644 20220517/test-02.red create mode 100644 20220517/test-03.red create mode 100644 20220517/test-04.red create mode 100644 20220517/test-05.red diff --git a/20220517/catcan2.red b/20220517/catcan2.red new file mode 100644 index 0000000..f0aa1dc --- /dev/null +++ b/20220517/catcan2.red @@ -0,0 +1,21 @@ +;name Cat Can +;author A. Kirchner, F. Uy, minor changes by P. Gerwinski +;assert 1 +; +; Your basic two sweep methodical bomber. +; Fires SPL 0 and JMP -1 at every eight +; addresses, then erases the core with +; DAT bombs. + +start mov trap2, < bomb + mov trap1, < bomb + sub # 6, bomb + jmn start, bomb ; trap loop +set mov # -5, bomb +kill mov bomb, @ bomb + djn kill, bomb ; kill loop +reset jmp set +bomb dat # -8 +trap1 spl 0 +trap2 jmp -1 + end start diff --git a/20220517/knirps.red b/20220517/knirps.red new file mode 100644 index 0000000..befaa2a --- /dev/null +++ b/20220517/knirps.red @@ -0,0 +1,5 @@ +;name Knirps +;assert 1 + +start mov 0, 1 + end start diff --git a/20220517/mice.red b/20220517/mice.red new file mode 100644 index 0000000..88012d2 --- /dev/null +++ b/20220517/mice.red @@ -0,0 +1,16 @@ +;name Mice +;author Chip Wendell +;assert 1 + +ptr dat #0 +start mov #12, ptr ; n = 12 +loop mov @ptr, <dest ; *--dest = *(ptr+(*ptr)) + djn loop, ptr ; if(--ptr != 0) + ; goto loop + spl @dest ; split(*dest) + add #653, dest ; dest += 653 + jmz start, ptr ; if(!ptr) + ; goto start +dest dat #833 + + end start diff --git a/20220517/nothing.red b/20220517/nothing.red new file mode 100644 index 0000000..5d6f3c2 --- /dev/null +++ b/20220517/nothing.red @@ -0,0 +1,5 @@ +;name Nothing +;assert 1 + +start jmp 0 + end start diff --git a/20220517/rtech-20220517.txt b/20220517/rtech-20220517.txt new file mode 100644 index 0000000..ed2a328 --- /dev/null +++ b/20220517/rtech-20220517.txt @@ -0,0 +1,243 @@ +Alte Klausuren (Hardwarenahe Programmierung): + +https://gitlab.cvh-server.de/pgerwinski/hp + +Prüfungsform im Sommersemester 2022: Hausarbeit mit Kolloquium + +Ideen für Projekte: z.B. bei heise.de + - Selbstgebauter Retro-Rechner - das Mainboard Terminal + https://www.heise.de/-7095736 + + +Struktur von Assembler-Programmen, 17.05.2022, 10:34:04 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Arithmetisch-logische Befehle: Operation, Operanden + + Operation: +, -, *, /, and, or, xor, ... + + Operanden, z.B. für "+": 1. und 2. Summand, Ergebnis + + Beispiele: + + i860: + + add r24, r26, r28 + + "Nimm die Inhalte der Register 24 und 26, addiere sie, + und speichere das Ergebnis in Register 28." + + IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard: + + addl %eax, %ebx + + "Nimm den Inhalt der Register eax und ebx, addiere sie, + und speichere das Ergebnis in Register ebx." + + (Die Endung "l" steht für 32 Bit.) + + IA-32 (Intel-Architektur, 32 Bit), Intel-Syntax: + + add ebx, eax + + "Nimm den Inhalt der Register eax und ebx, addiere sie, + und speichere das Ergebnis in Register ebx." + + (Die Register eax und ebx haben immer 32 Bit.) + +Sprungbefehle: Operand = Sprungziel + + Beispiele: + + IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard: + + jbe .L2 + + "Ist bei der letzten arithmetisch-logischen Operation + 'below or equal' herausgekommen? (D.h. z.B.: Das Ergebnis + einer Subtraktion ist negativ oder null.) + Falls ja, springe an die Speicherzelle, + der wir vorher den Namen '.L2' gegeben haben." + + Prüfung, ob ein Wert kleiner oder gleich 7 ist: + + Wert: im eax-Register + + subl $7, %eax + jbe .L2 + + Nachteil: Danach ist der Wert des eax-Registers verändert. + Gegenmaßnahme: zwischenspeichern + + movl %eax, %ebx + subl $7, %ebx + jbe .L2 + + Andere Gegenmaßnahme: cmp-Befehl ("compare") + + cmpl $7, %eax + jbe .L2 + + "Führe die Subtraktion aus, aber verwerfe das Ergebnis und merke + dir nur, ob das Ergebnis größer, kleiner oder gleich Null war." + + Wenn wir ein Programm direkt mit einem jbe-Befehl starten, + hängt das Ergebnis von der letzten arithmetisch-logischen Operation + des vorherigen Programms ab, also letztlich vom Zufall. + +Lade- und Speicher-Befehle: Operanden = Speicherzellen (einschließlich Prozessorregister) + + Beispiele: + + IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard: + + movb %al, b + + "Nimm den Inhalt des al-Registers und speichere ihn + in der Speicherzelle, der wir den Namen b gegeben haben." + + (Die Endung "b" steht für 8 Bit.) + + movl %eax, %ebx + + "Nimm den Inhalt des eax-Registers und speichere ihn im ebx-Register." + + movl $1, %eax + + "Nimm die Zahl 1 und speichere sie im Register eax." + + IA-32 (Intel-Architektur, 32 Bit), Intel-Syntax: + + mov ebx, eax + + "Nimm den Inhalt des eax-Registers und speichere ihn im ebx-Register." + + mov eax, #1 + + "Nimm die Zahl 1 und speichere sie im Register eax." + + ATmega, AT&T-Syntax: + + ldi r24, lo8(1) + + "Nimm die untersten 8 Bit der Zahl 1 und speichere sie im Register r24." + + (Das Register r24 hat nur 8 Bit.) + +Adressierungsarten: + + unmittelbar: "die Zahl" + + Beispiele: + + IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard: + movl $1, %eax + "Nimm die Zahl 1 und speichere sie im Register eax." + + IA-32 (Intel-Architektur, 32 Bit), Intel-Syntax: + mov eax, #1 + "Nimm die Zahl 1 und speichere sie im Register eax." + + ATmega, AT&T-Syntax: + ldi r24, lo8(1) + "Nimm die untersten 8 Bit der Zahl 1 und speichere sie im Register r24." + (Das Register r24 hat nur 8 Bit.) + + Register: "im Register" + + Beispiele: dieselben (siehe oben) + + Speicher absolut + + Beispiele: + + IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard: + movb %al, b + "Nimm den Inhalt des al-Registers und speichere ihn + in der Speicherzelle, der wir den Namen b gegeben haben." + + "Speicher" steht hier für: Arbeitsspeicher, RAM (random-access memory) + durchnumerierte Speicherzellen + + "Register" steht für spezielle Speicherzellen im Inneren des Prozessors. + Diese können spezielle Namen haben (eax, ebx, al, rdi, ...) + oder ebenfalls durchnumeriert sein (r0, r1, ..., r24, ...). + + Register "können mehr" und arbeiten schneller. + Es gibt mehr Befehle für die Adressierungsart "Register" + als für die Adressierungsart "Speicher". + + Arbeitsspeicher (RAM) steht in größeren Mengen zur Verfügung. + Beispiel: IA-64 hat vielleicht 30 Register, + aber typischerweise mehrere GB an Arbeitsspeicher. + + "absolut" bedeutet: Der Operand ist die Nummer der Speicherzelle. + + Speicher relativ + + "relativ" bedeutet: Der Operand ist die Nummer der Speicherzelle, + gezählt ab einer vorher bekannten Zahl. + + Z.B. in Zusammenhang mit Sprungbefehlen: + "Springe um 5 Speicherzellen nach oben." + + Zweck: Einfachere Relokation des Programms + (Das Programm ist lauffähig, egal wo es sich im Speicher befindet.) + + Speicher indirekt + + Beispiel: IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard: + + cmpb (%ebx), %dl + "Betrachte den Inhalt des ebx-Registers als Nummer einer Speicherzelle (Zeiger) + und vergleiche die 8-Bit-Zahl, die sich dort befindet, mit dem dl-Register." + + movb (%ebx), %dl + "Betrachte den Inhalt des ebx-Registers als Nummer einer Speicherzelle (Zeiger) + und kopiere die 8-Bit-Zahl, die sich dort befindet, in das dl-Register." + + addb %dl, (%ebx) + "Betrachte den Inhalt des ebx-Registers als Nummer einer Speicherzelle (Zeiger) + und addiere den Inhalt des dl-Registers zu der 8-Bit-Zahl, die sich dort befindet." + + Beispiel: Redcode + + mov -1, @-2 + + "Betrachte den Inhalt der Speicherzelle, die sich 2 weiter oben befindet, + als Nummer einer Speicherzelle (Zeiger) + und kopiere den Inhalt der Speicherzelle, die sich 1 weiter oben befindet, dorthin." + +Zusätzliche Manipulatoren + + Prä-Dekrement: + + Bevor der Befehl ausgeführt wird, subtrahiere eine Konstante von einem der Operanden. + + Beispiel: Redcode + + mov -1, <-2 + + 1. Prä-Dekrement: + "Subtrahiere 1 von der Speicherzelle, die sich 2 weiter oben befindet." + 2. mov-Befehl: + "Betrachte den Inhalt der Speicherzelle, die sich 2 weiter oben befindet, + als Nummer einer Speicherzelle (Zeiger) + und kopiere den Inhalt der Speicherzelle, die sich 1 weiter oben befindet, dorthin." + + Analog: Prä-Inkrement, Post-Dekrement, Post-Inkrement + +Hardware-spezifische Befehle + + Beispiel: IA-32 (Intel-Architektur, 32 Bit), AT&T-Syntax, GNU-Standard: + + syscall + + Rufe eine Funktion im Betriebssystemkern auf. + + Beispiel: Redcode + + spl 2 + + "Führe das Programm nicht nur in der folgenden Speicherzelle aus, + sondern auch in der genannten, hier also in der übernächsten. + Dadurch entstehen zwei Tasks (oder Threads), die sich die Rechenzeit teilen." diff --git a/20220517/sk.red b/20220517/sk.red new file mode 100644 index 0000000..49af805 --- /dev/null +++ b/20220517/sk.red @@ -0,0 +1,8 @@ +;name SK +;version 2 +;author Peter Gerwinski +;assert 1 + + spl 2 + jmp 0, <-50 + mov 0, 1 diff --git a/20220517/test-01.red b/20220517/test-01.red new file mode 100644 index 0000000..1e26a54 --- /dev/null +++ b/20220517/test-01.red @@ -0,0 +1 @@ +mov -1, @-2 diff --git a/20220517/test-02.red b/20220517/test-02.red new file mode 100644 index 0000000..26bdb83 --- /dev/null +++ b/20220517/test-02.red @@ -0,0 +1,9 @@ + dat -3 + dat -2 + dat -1 +start mov -1, @-2 + dat 1 + dat 2 + dat 3 + + end start diff --git a/20220517/test-03.red b/20220517/test-03.red new file mode 100644 index 0000000..f6a3e94 --- /dev/null +++ b/20220517/test-03.red @@ -0,0 +1,10 @@ + dat -3 + dat -2 + dat -1 +start mov -1, @-2 + jmp start + dat 1 + dat 2 + dat 3 + + end start diff --git a/20220517/test-04.red b/20220517/test-04.red new file mode 100644 index 0000000..16e568b --- /dev/null +++ b/20220517/test-04.red @@ -0,0 +1,10 @@ + dat -3 + dat -2 + dat -1 +start mov -1, <-2 + jmp start + dat 1 + dat 2 + dat 3 + + end start diff --git a/20220517/test-05.red b/20220517/test-05.red new file mode 100644 index 0000000..7367de9 --- /dev/null +++ b/20220517/test-05.red @@ -0,0 +1,12 @@ + dat -3 + dat -2 + dat -1 +start spl 3 +loop mov -1, <-3 + jmp loop + mov 0, 1 + dat 1 + dat 2 + dat 3 + + end start -- GitLab