Datenverarbeitung


Stand: 2004-03

Thomas Mertin
Netzwerk- und Elektrotechnik

D-41334 Nettetal

Maschinensprache

Sprachhirachie

nach oben

1. Befehlssatz des 8085

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-Re­gister

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

nach oben

2. Strukturiertes Programmieren

Mögliche Darstellungsformen:

SB = Strukturblock

Funktion

Symbol

 

Nassi-Schneidermann

DIN 66001

Unterprogramm

 

Elementarblock

Sequenz

Bedingte Verzweigung

Bedingte Verzweigung ohne ELSE-Block


Fallunterscheidung

Fallunterscheidung mit Fehler­ausgang

Wiederholung: kopfgesteuerte Schleife

Wiederholung: fußgesteuerte Schleife

Wiederholung: Schleife mit Unterbrechung

Wiederholung: kopfgesteuerte Schleife mit Unterbrechung

nach oben

3. Kurzbeschreibung des Betriebssystems MAT 85

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.

Monitor-Kommandos

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 / Disassembler-Kommandos

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.

Tracer-Kommandos

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 oben

4. Software Entwicklung

Beispiel:

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"

Zeitschleifen

Einfache Zeitschleifen


Maximale Länge der Zeitschleife (x = FFH = 255)

Zeitschleifen mit zwei Registern (verschachtelte Zeitschleife)

Maximale Länge der Zeitschleife (x = y = FFH = 255):

Zeitschleifen mit Registerpaaren

Maximale Länge der Zeitschleife (x =  FFFFH = 65535):

Indirekte Speicheradressierung

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:

Sortier Routinen

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.

Unterprogramme

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:

Der Stack

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 wer­den 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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Unterprogramme des Betriebsprogramms

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 Regi­sters C wie folgt gewählt:
0 = ASCII-Zeichen
1 = Binärzahl
2 = Dezimalzahl
3 = Hexadezimalzahl

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