Stand: 2004-03
Thomas Mertin
Netzwerk- und Elektrotechnik
D-41334 Nettetal
Sprachhirachie
Befehl |
Wirkung |
|
ACI |
Add Immediate to A with Carry |
Addiere mit Carry unmittelbar zum Akku |
ADC |
Add Memory to A with Carry |
Addiere Speicher und Carry zum Akku |
ADD |
Add Register to A |
Addiere Register zum Akku |
ADI |
Add Immediate to A |
Addiere unmittelbar zum Akku |
ANA |
AND Register with A |
UNDiere Register mit Akku |
ANI |
AND Immediate with A |
UNDiere unmittelbar mit Akku |
CALL |
Call Unconditional |
Verzweige ohne Bedingung zum Unterprogramm |
CC |
Call on Carry |
Verzweige zum Unterprogramm, wenn Carry = 1 |
CM |
Call on Minus |
Verzweige zum Unterprogramm, wenn Negative = 1 |
CMA |
Complement A |
Komplementiere Akku |
CMC |
Complement Carry |
Komplementiere Carry |
CMP |
Compare with A |
Vergleiche mit Akku |
CNC |
Call on No Carry |
Verzweige zum Unterprogramm, wenn Carry = 0 |
CNZ |
Call on Not Zero |
Verzweige zum Unterprogramm, wenn Zero = 0 |
CP |
Call on Positive |
Verzweige zum Unterprogramm, wenn Negative = 0 |
CPE |
Call on Parity Even |
Verzweige zum Unterprogramm, wenn Parity = 1 |
CPI |
Compare Immediate with A |
Vergleiche 8 Bit Wert unmittelbar mit Akku |
CPO |
Call on Parity Odd |
Verzweige zum Unterprogramm, wenn Parity = 0 |
CZ |
Call on Zero |
Verzweige zum Unterprogramm, wenn Zero = 1 |
DAA |
Decimal Adjust A |
ordne Akku dezimal an |
DAD |
Add To H/L |
Addiere zum H/L-Register |
DCR |
Decrement |
Dekrementiere (8 Bit) |
DCX |
Decrement |
Dekrementiere (16 Bit) |
DI |
Disable Interrupts |
Sperre Unterbrechungen |
EI |
Enable Interrupts |
Ermögliche Unterbrechungen |
HLT |
Halt |
Prozessor Halt |
IN |
Input |
lese vom Eingabeport |
INR |
Increment |
Inkrementiere (8 Bit) |
INX |
Increment |
Inkrementiere (16 Bit) |
JC |
Jump on Carry |
springe, wenn Carry = 1 |
JM |
Jump on Minus |
springe, wenn Negative = 1 |
JMP |
Jump Unconditional |
springe unbedingt |
JNC |
Jump on No Carry |
springe, wenn Carry = 0 |
JNZ |
Jump on Not Zero |
springe, wenn Zero = 0 |
JP |
Jump on Positive |
springe, wenn Negative = 0 |
JPE |
Jump on Parity Even |
springe, wenn Parity = 1 |
JPO |
Jump on Parity Odd |
springe, wenn Parity = 0 |
JZ |
Jump on Zero |
springe, wenn Zero = 1 |
LDA |
Load A Direct |
Übertrage von direkter Speicheradresse in den Akku |
LDAX |
Load A at Address |
Übertrage von indirekter Speicheradresse in den Akku |
LHLD |
Load H/L Direct |
Übertrage von direkter Speicheradresse nach H/L-Register |
LXI |
Load Immediate |
Lade unmittelbar (16 Bit) |
MOV |
Move |
Übertrage Daten |
MVI |
Move Immediate |
Übertrage unmittelbar (8 Bit) |
NOP |
No Operation |
keine Operation |
ORA |
OR Register with A |
ODERiere Register mit Akku |
ORI |
OR Immediate with A |
ODERiere unmittelbar mit Akku |
OUT |
Output |
Schreibe zum Ausgabeport |
PCHL |
H/L to Programm Counter |
Übertrage H/L-Register zum Programmzähler |
POP |
Pop Register Pair off Stack |
Übertrage vom Stapelregister |
PUSH |
Push Register Pair on Stack |
Übertrage zum Stapelregister |
RAL |
Rotate A Left through Carry |
Rotiere Akku links durch Carry |
RAR |
Rotate A Right through Carry |
Rotiere Akku rechts durch Carry |
RC |
Return on Carry |
Kehre von Unterprogramm zurück, wenn Carry = 1 |
RET |
Return Unconditional |
Kehre ohne Bedingung von Unterprogramm zurück |
RIM |
Read Interrupt Mask |
Lese Unterbrechungsmaskenregister |
RLC |
Rotate A Left, MSB to Carry |
Rotiere Akku links, MSB nach Carry |
RM |
Return on Minus |
Kehre von Unterprogramm zurück, wenn Negative = 1 |
RNC |
Return on No Carry |
Kehre von Unterprogramm zurück, wenn Carry = 0 |
RNZ |
Return on Not Zero |
Kehre von Unterprogramm zurück, wenn Zero = 0 |
RP |
Return on Positive |
Kehre von Unterprogramm zurück, wenn Negative = 0 |
RPE |
Return on Parity Even |
Kehre von Unterprogramm zurück, wenn Parity = 1 |
RPO |
Return on Parity Odd |
Kehre von Unterprogramm zurück, wenn Parity = 0 |
RRC |
Rotate A Right, LSB to Carry |
Rotiere Akku rechts, LSB nach Carry |
RST |
Restart |
Verzweige zu Restart Adresse |
RZ |
Return on Zero |
Kehre von Unterprogramm zurück, wenn Zero = 1 |
SBB |
Subtract Register from A with Borrow |
Subtrahiere Register und Carry vom Akku |
SBI |
Subtract Immediate from A with Carry |
Subtrahiere mit Carry unmittelbar vom Akku |
SHLD |
Store H/L Direct |
Übertrage H/L-Register nach direkter Speicheradresse |
SIM |
Set Interrupt Mask |
Schreibe Unterbrechungsmaskenregister |
SPHL |
H/L to Stack-Pointer |
Übertrage H/L-Register zum Stapelzeiger |
STA |
Store A Direct |
Übertrage Akku nach direkter Speicheradresse |
STAX |
Store A at Address |
Übertrage Akku nach indirekter Speicheradresse |
STC |
Set Carry |
Setze Carry |
SUB |
Subtract Register from A |
Subtrahiere Register vom Akku |
SUI |
Subtract Immediate from A |
Subtrahiere unmittelbar vom Akku |
XCHG |
Exchange D/E and H/L Register |
Vertausche D/E- und H/L-Registerpaar |
XRA |
Exclusive OR Register with A |
XORiere Register mit Akku |
XRI |
Exclusive OR Immediate with A |
XORiere unmittelbar mit Akku |
XTHL |
Exchange Top of Stack and H/L |
Vertausche Spitze des Stapels mit H/L-Register |
Mögliche Darstellungsformen:
SB = Strukturblock
Funktion |
Symbol |
|
|
Nassi-Schneidermann |
DIN 66001 |
Unterprogramm |
|
|
Elementarblock |
|
|
Sequenz |
|
|
Bedingte Verzweigung |
|
|
Bedingte Verzweigung ohne ELSE-Block |
|
|
Fallunterscheidung |
|
|
Fallunterscheidung mit Fehlerausgang |
|
|
Wiederholung: kopfgesteuerte Schleife |
|
|
Wiederholung: fußgesteuerte Schleife |
|
|
Wiederholung: Schleife mit Unterbrechung |
|
|
Wiederholung: kopfgesteuerte Schleife mit Unterbrechung |
|
|
Einstellung der Schnittstelle: COM 1, 4800, N, 8, 1
Monitor-Kommandos stellen Programmabläufe auf den Bildschirm dar oder ermöglicht den Dialog mit dem Rechner.
BREAKPOINT: Dieses Kommando erlaubt es, mit dem GO-Kommando Unterbrechungspunkte einzugeben. Unterbrechungspunkte sind Adressen aus dem Speicherbereich des Anwenderprogramms, an denen die Programmbearbeitung unterbrochen werden soll. Nach der Unterbrechung werden die Inhalte der CPU-Register angezeigt.
GO: Mit diesem Kommando können eingegebene Programme gestartet werden.
HELP: Dient dazu, alle verfügbaren Kommandos des Betriebssystems anzuzeigen.
IN: Dieses Kommando dient dazu, Daten von Eingabe-Ports zu lesen und anzuzeigen.
MEMORY: Mit diesem Kommando lassen sich die Inhalte von Speicherzeilen in verschiedenen Formaten (B = Bit, H = Hex, A = ASCII) ausdrucken und ändern.
OUT: Dient dazu, Daten an Ausgabe-Ports zu senden.
PRINT: Mit diesem Kommando können die Inhalte von Speicherzeilen in verschiedenen Formaten (Binär, Hexadezimal, Dezimal, ASCII) formatiert (pro Zeile max. 8 Inhalte) ausgedruckt werden.
REGISTER: Mit diesem Kommando können die Anfangswerte der CPU-Register, z.B. vor einem Testlauf des Anwenderprogramms, vorgegeben werden.
ASSEMBLER: Mit diesem Kommando wird ein Programm aufgerufen, das es ermöglicht, Anwendungsprogramme in Mnemo-Code einzugeben. Der eingegebene Code wird Zeile für Zeile in den zugehörigen Maschinen-Code übersetzt und im RAM-Speicher abgelegt.
DISASSEMBLER: Mit diesem Kommando können Programme, die im Maschinen-Code gespeichert sind, in den Assembler-Code übersetzt werden.
NEXT INSTRUCTION: Mit diesem Kommando wird ein Tracer (Verfolger) aktiviert, der es ermöglicht, die Ausführung und Wirkungsweise einer vorgegebenen Anzahl von Programmbefehlen zu verfolgen. dazu wird nach jedem Befehl die Programmbearbeitung kurz unterbrochen und die Inhalte aller CPU-Register werden protokolliert.
TRACE INTERVAL: Dieses Kommando bewirkt eine Protokollierung der Registerinhalte immer dann, wenn diejenigen Programmbefehle abgearbeitet werden, die in einem vorher zu bestimmenden Speicherbereich liegen.
nach obenBeispiel:
1) Ein Assembler-Programm ist zu entwickeln. Der Wert der Paralleleingabe (Adr. 00) soll:
a) in alle Register übertragen
b) unter der Adresse C100 abgelegt werden
c) an der Parallelausgabe (Adr. 01) ausgegeben werden.
2) Durch den Schalter B0 sollen jeweils alle acht Ausgänge ein- bzw. ausgeschaltet werden.
ANF und AUSG sind Label bzw. Sprungmarken. Sie dürfen maximal 8 Zeichen enthalten.
3) Parallelport Adr.: 00H:
B0 "ein" -〉 Outport Adresse 01H B0...B3"ein"
B1 "ein" -〉 Outport Adresse 01H B4...B7"ein"
B0 und B1 "ein" -〉 Outport Adresse 01H B0...B7 "aus"
Maximale Länge der Zeitschleife (x = FFH = 255)
Maximale Länge der Zeitschleife (x = y = FFH = 255):
Maximale Länge der Zeitschleife (x = FFFFH = 65535):
Beispiel:
Auf der Speicherplatzadresse 0C200 steht ein beliebiger Zahlenwert (Dualzahl, 1. Operand). auf der Adresse 0C201 steht ein zweiter Operand. Beide Operanden sollen addiert werden und das Ergebnis auf Adresse 0C202 abgelegt werden. Der Übertrag soll auf Adresse 0C203 stehen. Programmende mit JMP 0040 (Kommandointerpreter, RST 1). Startadresse des Programms 0C000.
Direkte Adressierung:
Indirekte Adressierung:
Werte sortieren
Auf der Adresse C200 steht die Länge für eine Zahlentabelle, welche bei C201 beginnt. Die Zahlenwerte sollen der Größe nach aufsteigend sortiert werden und im selben Speicherbereich abgelegt werden.
Beispiel:
Adr. |
I. |
II. |
III. |
IV. |
V. |
VI. |
VII. |
VIII. |
X. |
XI. |
XVI. |
||
C200 := 05 |
1. Durchlauf |
2. Durchlauf |
3. Durchlauf |
4. |
|
||||||||
C201 := 30 |
2A |
2A |
2A |
2A |
2A |
2A |
2A |
2A |
10 |
10 |
10 |
||
C202 := 2A |
30 |
30 |
30 |
30 |
30 |
30 |
10 |
10 |
2A |
15 |
15 |
||
C203 := 74 |
74 |
74 |
74 |
10 |
10 |
10 |
30 |
15 |
15 |
2A |
2A |
||
C204 := 10 |
10 |
10 |
10 |
74 |
15 |
15 |
15 |
30 |
30 |
30 |
30 |
||
C205 := 15 |
15 |
15 |
15 |
15 |
74 |
74 |
74 |
74 |
74 |
74 |
74 |
||
Maximale Anzahl der Durchläufe: Tabellenlänge - 1
Die Tabelle ist sortiert, wenn keine Vertauschung innerhalb eines Durchlaufes erfolgt ist oder wenn die maximale Anzahl von Durchläufen erreicht ist.
Beispiel: |
Immer wieder benötigte Programmodule werden sinnvollerweise in einem Speicherbereich abgelegt, welche aus dem Hauptprogramm ausgelagert ist. Bei Bedarf verzweigt man zu diesem Speicherbereich.
Problem:
Abhilfe:
Gestaltung des Moduls als Unterprogramm.
Aufruf:
CALL
Wirkung:
Der Prozessor merkt sich die Adresse wo er im Hauptprogramm ausgestiegen ist, in dem er den Programmcounter (PC) um drei erhöht und diesen Adresswert im Stapelzeiger (Stackpointer) ablegt.
Es erfolgt ein unbedingter Sprung zu der auf CALL folgenden Adresse.
Nach der Beendigung der Unterprogrammroutine erfolgt ein Rücksprung mit dem Befehl RET.
Wirkung:
Es erfolgt eine Übertragung des im Stackpointer vermerkten Adresswertes im Programmcounter und das Hauptprogramm wird an dieser Stelle fortgesetzt.
Beispiel: Blinklicht
Die Leuchtdiode B0 am Ausgabeport 01 soll mit einer Frequenz von 1Hz blinken.
Anzahl der Takte für 1Hz:
Hauptprogramm: | Unterprogramm ZEIT: |
Nehmen wir an, jemand addiert eine Liste von Zahlen, dieser jemand soll nun seine Arbeit unterbrechen und etwas anderes tun. Das kann eine Hilfsrechnung zur Addition sein (Unterprogramm) oder eine andere Tätigkeit hat Vorrang (Interrupt). Der Mann muß dann folgendes machen:
Er muß sich merken, an welcher Stelle in der Liste die Unterbrechung erfolgte, oder besser welche Addition als nächstes ausgeführt werden muß. Er muß sich das Zwischenergebnis merken.
Ähnliches gilt für einen Prozessor. Soll z.B. in einem laufendem Programm ein Unterprogramm oder eine Unterbrechungsroutine abgearbeitet werden, müssen reproduzierbare Verhältnisse geschaffen werden, damit nach dem Ende des Unterprogramms oder der Unterbrechung das Hauptprogramm korrekt weiter läuft.
Bevor mit einem Unterprogramm begonnen werden kann, müssen alle Register, die vom Unterprogramm benötigt werden, in einem reservierten Speicherbereich ausgelagert werden. Dieser Speicherbereich wird Stapelspeicher, Kellerspeicher oder Stack genannt.
Dahin transferiert man:
Den Stand des Befehlszählers für den Befehl der vom Hauptprogramm als nächstes ausgeführt werden soll. Durch den Befehl zum Aufruf des Unterprogramms (CALL) erfolgt dies automatisch.
Den Inhalt der CPU-Register, soweit sie vom Unterprogramm benutzt werden. Das sind meist der Akku und die Flags und meist noch weitere Register, jeweils paarweise.
Das Retten der Registerinhalte erfolgt paarweise durch die PUSH Befehle, den umgekehrten Vorgang bewirken die POP Befehle.
Dabei ist dem Stack das Prinzip eigen:
LIFO (Last In First Out), d.h. das zuletzt gespeicherte Registerpaar wird als erstes wieder eingelesen.
Festgelegt wird der Stack durch einen Stackpointer (SP), der vom Programmierer auf einen bestimmten Anfangswert gesetzt wird. Hierdurch wird festgelegt, ab welcher Speicheradresse der Stack beginnen soll.
|
|
|
|
nach Befehlsablauf |
||||
; HP |
|
|
PC |
SP |
A |
B |
C |
Z-Flag |
|
ORG |
0E000 |
C100 |
FC32 |
30 |
31 |
32 |
0 |
E000 |
LXI |
SP, 0E1FF |
E000 |
E1FF |
|
|
|
|
E003 |
IN |
00 |
E003 |
|
88 |
|
|
|
E005 |
MOV |
C, A |
E005 |
|
|
|
88 |
|
E006 |
CALL |
0E100 |
E006 |
E1FD |
|
|
|
|
E009 |
IN |
00 |
E009 |
E1FF |
x |
|
|
|
E00B |
CMP |
C |
E00B |
|
|
|
|
|
E00C |
JNZ |
0E003 |
|
|
|
|
|
|
E00F |
OUT |
01 |
|
|
|
|
|
|
E011 |
JMP |
0E003 |
|
|
|
|
|
|
; |
|
|
|
|
|
|
|
|
; UP |
|
|
|
|
|
|
|
|
|
ORG |
0E100 |
|
|
|
|
|
|
E100 |
PUSH |
B |
E100 |
E1FB |
|
|
|
|
E101 |
MVI |
C, 0FF |
E101 |
|
|
|
FF |
|
E103 |
DCR |
C |
E103 |
|
|
|
(C)-1 |
|
E104 |
JNZ |
0E103 |
E104 |
|
|
|
|
0->1 |
E107 |
POP |
B |
E107 |
E1FD |
|
|
32 |
|
E108 |
RET |
|
E108 |
E1FF |
|
|
|
|
|
END |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Unterprogrammname |
Eingangsadresse |
Veränderte Register |
Funktion des Unterprogramms |
KMD |
0040 |
|
Rücksprung in die Kommandoroutine des Monitorprogramms und Ausdruck von KMD>. |
RCHAR |
0043 |
A |
Liest ein Zeichen von der Tastatur ein. Der ASCII-Code des Zeichens steht im Akku. Bei ESC Rückkehr in die Kommandoroutine und Klingeln. |
WCHARI |
0055 |
|
Gibt ein Zeichen, das nach dem CALL-Befehl im Speicher steht, auf Bildschirm und Drucker aus. Das auszugebende Zeichen muß mit der DB-Anweisung nach dem CALL-Befehl in den Speicher geschrieben werden. |
WAHEX |
0058 |
|
Gibt den Akku-Inhalt als zwei Hexadezimalziffern auf dem Bildschirm / Drucker aus. |
WHLHEX |
005B |
H, L |
Gibt den H/L - Registerinhalt als vier Hexadezimalziffern auf dem Bildschirm / Drucker aus. |
WABIN |
005E |
A |
Gibt den Akku-Inhalt als Binärzahl am Bildschirm / Drucker aus. |
WADEZ |
0061 |
A |
Gibt den Akku-Inhalt als Dezimalzahl auf dem Bildschirm / Drucker aus. |
WAFOR |
0064 |
A, C |
Gibt den Akku-Inhalt in einem der zu wählenden Formate ASCII, Binär, Dezimal oder Hex auf dem Bildschirm / Drucker aus. Das Format wird durch den Inhalt des Registers C wie folgt gewählt: |
WBLANK |
0067 |
|
Gibt ein Leerzeichen auf dem Bildschirm / Drucker aus. |
WBUFI |
0060 |
|
Gibt den hinter dem CALL-Befehl stehenden Text auf dem Bildschirm aus. Der Text muß mit der DB-Anweisung in den Speicher geladen werden. Am Ende des Textes muß als Enderkennung eine 0 stehen. |
WCRLFI |
0073 |
|
Gibt einen Wagenrücklauf (CR, Carriage Return), eine neue Zeile (LF, Line Feed) und Text in diese neue Zeile aus. Der Text muß wie bei "WBUFI" vorher eingegeben werden. |
HADR |
08DF |
|
Liest eine 16-Bit-Adresse von der Tastatur ein und speichert sie im Doppelregister H/L ab. Dabei gelangt der höherwertige Teil der Adresse ins H-Register und der niederwertige Teil ins L-Register. Die Eingabe der Adresse muß mit CR oder SP abgeschlossen werden. |
BSTIME |
0895 |
A, D, E |
Zeitverzögerung von 0,24s. |
CMP2 |
0EA8 |
A |
Vergleicht die Inhalte der Register D/E mit denen der Register H/L. Wenn (H/L) > (D/E) ist, wird das Carry-Flag auf 1 gesetzt, sonst 0. |
SUB2 |
1039 |
A, H, L, D, E |
Subtrahiert die 16-Bit-Zahl im Doppelregister D/E von der 16-Bit-Zahl im Doppelregister H/L. Das Ergebnis steht dann im Doppelregister H/L. |
WBUF |
0BA1 |
|
Gibt den Text aus einem Textpuffer aus, dessen Anfangsadresse durch den Inhalt des H/L-Registers adressiert ist. Der Text wird mit der DB-Anweisung ab dieser Adresse geladen, das Textende muß mit 0 gekennzeichnet sein. Nach der Ausgabe des Textes zeigt das H/L-Register auf die Adresse nach dem Endezeichen. |
Beispiel für Bildschirm (CRT, Cathode Ray Tube) löschen:
CALL 0055
DB 1A
CALL 0895 ;warten
nach oben | ||
Seite zurück | Inhalt | Seite vor |
Startseite |
Nachricht an: webmaster@mertech.de