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

Notizen und Beispiel-Programme 17.5.2022

parent c4a4ae4c
Branches
Tags
No related merge requests found
;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
;name Knirps
;assert 1
start mov 0, 1
end start
;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
;name Nothing
;assert 1
start jmp 0
end start
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."
;name SK
;version 2
;author Peter Gerwinski
;assert 1
spl 2
jmp 0, <-50
mov 0, 1
mov -1, @-2
dat -3
dat -2
dat -1
start mov -1, @-2
dat 1
dat 2
dat 3
end start
dat -3
dat -2
dat -1
start mov -1, @-2
jmp start
dat 1
dat 2
dat 3
end start
dat -3
dat -2
dat -1
start mov -1, <-2
jmp start
dat 1
dat 2
dat 3
end start
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment