Beispiele für Programme in Maschinensprache
Zurück in die Steinzeit der Computergeschichte, als Speicher und Rechenleistung ein knappes Gut waren und jeder Programmcode gut überlegt sein musste.
Du wirst erstaunt sein, welche Aufgaben Du trotzdem mit nur 16 Byte Programmcode und ein paar wenigen Maschinenbefehlen lösen kannst.
Inhalt
Fibonacci Reihe
Adr |
Befehl |
Code |
Beschreibung |
00 |
LDA 13 |
0001 1101 |
lade Register A mit Inhalt von Adresse 13 |
01 |
ADD 14 |
0010 1110 |
addiere Wert von Adresse 14 zu Register A |
02 |
OUT |
1110 |
lade Register O mit dem Inhalt von Register A |
03 |
JPC 10 |
0110 1010 |
springe wenn Carry Flag auf Adresse 10 |
04 |
STA 15 |
1000 1111 |
speichere Register A auf Adresse 15 |
05 |
LDA 14 |
0001 1110 |
lade Register A mit Inhalt von Adresse 14 |
06 |
STA 13 |
1000 1101 |
speichere Register A auf Adresse 13 |
07 |
LDA 15 |
0001 1111 |
lade Register A mit Inhalt von Adresse 15 |
08 |
STA 14 |
1000 1110 |
speichere Register A auf Adresse 14 |
09 |
JMP 0 |
0100 0000 |
springe auf Adresse 0 |
10 |
HLT |
1111 |
halte Programm an |
.. |
|
|
|
13 |
var |
0000 0000 |
initial 0 |
14 |
var |
0000 0001 |
initial 1 |
15 |
var |
0000 0000 |
initial 0 |
Sieh Dir das Video Relais Computer rechnet die Fibonacci Reihe auf Youtube an @relaiscomputer
Zahlen im Speicher dividieren
Adr |
Befehl |
Code |
Beschreibung |
00 |
LDA 14 |
0001 1110 |
lade Register A mit Inhalt von Adresse 14 |
01 |
SUB 15 |
0010 1111 |
subtrahiere von Register A den Wert von Adresse 15 |
02 |
JPN 08 |
0101 1000 |
springe auf Adresse 8 falls (N)egativ Flag gesetzt |
03 |
STA 14 |
1000 1110 |
speichere Register A auf Adresse 14 |
04 |
LDA 13 |
0001 1101 |
lade Register A mit Inhalt von Adresse 13 |
05 |
ADD 12 |
0010 1100 |
addiere Wert von Adresse 12 zu Register A |
06 |
STA 13 |
1000 1101 |
speichere Register A auf Adresse 13 |
07 |
JMP 00 |
0100 1001 |
springe auf Adresse 0 |
08 |
LDA 13 |
0001 1101 |
lade Register A mit Inhalt von Adresse 13 |
09 |
OUT |
1110 |
lade Register O mit dem Inhalt von Register A |
10 |
HLT |
1111 |
halte Programm an |
.. |
|
|
|
12 |
var |
0000 0001 |
Zahl (1) |
13 |
var |
0000 0000 |
Ergebnis Ganzzahl |
14 |
var |
0001 0001 |
1. Dividend (17) Ergebnis Rest |
15 |
var |
0000 0100 |
2. Divisor (4) |
Welche Zahl im Speicher ist größer
Adr |
Befehl |
Code |
Beschreibung |
00 |
LDA 14 |
0001 1110 |
lade Register A mit Inhalt von Adresse 14 |
01 |
SUB 15 |
0011 1111 |
subtrahiere von Register A den Wert von Adresse 15 |
02 |
JPN 08 |
0101 1000 |
springe auf Adresse 8 falls (N)egativ Flag gesetzt |
03 |
JPZ 06 |
0101 1101 |
springe auf Adresse 6 falls (Z)ero Flag gesetzt |
04 |
LDA 14 |
0001 1110 |
lade Register A mit Inhalt von Adresse 14 |
05 |
JMP 09 |
0100 1001 |
springe auf Adresse 9 |
06 |
LDA 13 |
0001 1101 |
lade Register A mit Inhalt von Adresse 13 |
07 |
JMP 09 |
0100 1001 |
springe auf Adresse 9 |
08 |
LDA 15 |
0001 1111 |
lade Register A mit Inhalt von Adresse 15 |
09 |
OUT |
1110 |
lade Register O mit dem Inhalt von Register A |
10 |
HLT |
1111 |
halte Programm an |
.. |
|
|
|
13 |
var |
0000 0000 |
Wert für beide Zahlen gleich (0) |
14 |
var |
0000 0100 |
1. Zahl (4) |
15 |
var |
0000 1110 |
2. Zahl (14) |
Endlos Additionsmaschine
Adr |
Befehl |
Code |
Beschreibung |
00 |
INP |
1101 |
lade Dezimaleingabe von Tastatur in Register A |
01 |
ADD 15 |
0010 1111 |
addiere Wert von Adresse 15 zu Register A |
02 |
STA 15 |
1000 1111 |
speichere Inhalt von Register A auf Adresse 15 |
03 |
OUT |
1110 |
lade Register O mit dem Inhalt von Register A |
04 |
HLT |
1111 |
halte Programm an, weiter mit run |
05 |
JMP 00 |
0100 0000 |
springe auf Adresse 0 |
.. |
|
|
|
15 |
var |
0000 0000 |
initial 0 |
Quadratzahl bis 15
Adr |
Befehl |
Code |
Beschreibung |
00 |
INP |
1101 |
lade Dezimaleingabe von Tastatur in Register A |
01 |
STA 15 |
1000 1111 |
speichere Inhalt von Register A auf Adresse 15 |
02 |
LDA 14 |
0001 1110 |
lade Register A mit Inhalt von Adresse 14 |
03 |
LDX 15 |
1011 1111 |
lade Register C mit Inhalt von Adresse 15 |
04 |
ADD 15 |
0010 1111 |
addiere Wert von Adresse 15 zu Register A |
05 |
DCX |
1100 |
dekrementiere Inhalt von Register C (-1) |
06 |
JPX 04 |
0101 0100 |
springe auf Adresse 04 wenn Register C nicht Null (0) ist |
07 |
OUT |
1110 |
lade Register O mit dem Inhalt von Register A |
08 |
HLT |
1111 |
halte Programm an, weiter mit run |
09 |
JMP 00 |
0100 0000 |
springe auf Adresse 0 |
.. |
|
|
|
14 |
var |
0000 0000 |
initial 0 |
15 |
var |
|
aus Dezimaleingabe |
Zeigerakrobatik Quadratzahl
Die Summe der ersten n ungeraden Zahlen ist stets die n-te Quadratzahl
Wenn Daten zu code werden
Adr |
Befehl |
Code |
Beschreibung |
00 |
LDX 12 |
1011 1100 |
lade Register C mit Inhalt von Adresse 12 |
01 |
LDA 05 |
0001 0101 |
lade Register A mit Inhalt von Adresse 5 |
02 |
ADD 15 |
0010 1111 |
addiere Wert von Adresse 15 zu Register A |
03 |
STA 05 |
1000 0101 |
speichere Register A auf Adresse 5 |
04 |
LDA 11 |
0001 1011 |
lade Register A mit Inhalt von Adresse 11 |
05 |
code |
0010 1100 |
initial (ADD 12) |
06 |
STA 11 |
1000 1011 |
speichere Register A auf Adresse 11 |
07 |
DCX |
1100 |
dekrementiere Inhalt von Register C (-1) |
08 |
JPX 01 |
0101 0001 |
springe auf Adresse 01 wenn Register C nicht Null (0) ist |
09 |
OUT |
1110 |
lade Register O mit dem Inhalt von Register A |
10 |
HLT |
1111 |
halte Programm an |
11 |
var |
0000 0000 |
initial Ergebnis |
12 |
var |
0000 0011 |
n-te ungerade Zahl (3) |
13 |
var |
0000 0101 |
3. Zahl (5) |
14 |
var |
0000 0011 |
2. Zahl (3) |
15 |
var |
0000 0001 |
1. Zahl (1) |
BCD Umwandlung einer Zahl von 0 - 19
Adr |
Befehl |
Code |
Beschreibung |
00 |
INP |
1101 |
lade Dezimaleingabe von Tastatur in Register A |
01 |
STA 14 |
1000 1110 |
speichere Inhalt von Register A auf Adresse 14 |
02 |
SUB 15 |
0011 1111 |
subtrahiere von Register A den Wert von Adresse 15 |
03 |
JPN 07 |
0101 0111 |
springe auf Adresse 7 falls (N)egativ Flag gesetzt |
04 |
LDA 14 |
0001 1110 |
lade Register A mit Inhalt von Adresse 14 |
05 |
ADD 13 |
0010 1101 |
addiere Wert von Adresse 13 zu Register A |
06 |
JMP 08 |
0100 0000 |
springe auf Adresse 8 |
07 |
LDA 14 |
0001 1011 |
lade Register A mit Inhalt von Adresse 11 |
08 |
OUT |
1110 |
lade Register O mit dem Inhalt von Register A |
09 |
HLT |
1111 |
halte Programm an, weiter mit run |
10 |
JMP 00 |
0100 0000 |
springe auf Adresse 0 |
.. |
|
|
|
13 |
var |
0000 0110 |
Pseudotetrade (6) |
14 |
var |
0000 0000 |
aus Dezimaleingabe |
15 |
var |
0000 1010 |
Zahl (10) |
ganzzahliger Mittelwert 2er Zahlen
Adr |
Befehl |
Code |
Beschreibung |
00 |
INP |
1101 |
lade Dezimaleingabe von Tastatur in Register A |
01 |
STA 15 |
1000 1111 |
speichere Inhalt von Register A auf Adresse 15 |
02 |
HLT |
1111 |
halte Programm an, weiter mit run |
03 |
INP |
1101 |
lade Dezimaleingabe von Tastatur in Register A |
04 |
ADD 15 |
0010 1111 |
addiere Wert von Adresse 15 zu Register A |
05 |
SRA |
1001 |
verschiebe Register A nach rechts |
06 |
OUT |
1110 |
lade Register O mit dem Inhalt von Register A |
07 |
HLT |
1111 |
halte Programm an, weiter mit run |
08 |
JMP 00 |
0100 0000 |
springe auf Adresse 0 |
.. |
|
|
|
15 |
var |
0000 0000 |
aus Dezimaleingabe |
Laufschrift ausgeben
Adr |
Befehl |
Code |
Beschreibung |
00 |
LDA 11 |
0001 1011 |
lade Register A mit Inhalt von Adresse 11 |
01 |
OUT |
1110 |
lade Register O mit dem Inhalt von Register A |
02 |
LDA 12 |
0001 1100 |
lade Register A mit Inhalt von Adresse 12 |
03 |
OUT |
1110 |
lade Register O mit dem Inhalt von Register A |
04 |
LDA 13 |
0001 1101 |
lade Register A mit Inhalt von Adresse 13 |
05 |
OUT |
1110 |
lade Register O mit dem Inhalt von Register A |
06 |
LDA 14 |
0001 1110 |
lade Register A mit Inhalt von Adresse 14 |
07 |
OUT |
1110 |
lade Register O mit dem Inhalt von Register A |
08 |
LDA 15 |
0001 1111 |
lade Register A mit Inhalt von Adresse 15 |
09 |
OUT |
1110 |
lade Register O mit dem Inhalt von Register A |
10 |
JMP 00 |
0100 0000 |
springe auf Adresse 0 |
11 |
var |
0000 1100 |
|
12 |
var |
1100 0000 |
|
13 |
var |
0000 1101 |
|
14 |
var |
1101 1110 |
|
15 |
var |
1110 0000 |
|