Computer Architektur

Werbung
Computer Architektur
Fakultativfach Informatik 2001/2002
1. Die Sache mit den Bit und Byte
Man weiss es längst: Im Computer drin gibt's nur 1 und 0: Entweder hat es an einer bestimmten Stelle
eine Spannung oder eben nicht! Also gibt es immer eine von zwei Möglichkeiten (mit Ausnahme von "TriState"):
Spannung
1
Schalter ein
Lampe leuchtet
wahr
ja
...
...
keine Spannung
0
Schalter aus
Lampe leuchtet nicht
falsch
nein
...
...
Elektronik, welche nur mit zwei Zuständen arbeitet wird Digitaltechnik genannt. Im Gegensatz dazu gibt
es die Analogtechnik. Bei den Rechnern (und in vielen andern Bereichen der Elektronik) hat sich klar die
Digitaltechnik durchgesetzt.
Beispiele:
1. Die Piratenkiste: Auf dem Piratenschiff befindet sich die Schatzkiste. Sie ist mit fünf Schlössern
abgeschlossen, zu denen vier verschiedene Schlüssel A bis D passen (siehe Figur). Der Piraten –
Kapitän hat einen speziellen Schlüssel, seine zwei Stellvertreter haben ebenfalls je einen
unterschiedlichen Schlüssel. Die Matrosen haben alle den selben Schlüssel. Wir können die
Zustände auch hier mit 0 und 1 bezeichnen: „Kiste ist offen“ = 1, „Kiste ist abgeschlossen“ = 0,
„Schloss ist offen“ = 1, „Schloss ist zu“ = 0. Preisfrage: Wem gehören die Schlüssel?
Kapitän hat Schlüssel
_____________
Vize haben Schlüssel
und Schlüssel
_____________
_____________
Matrosen haben Schlüssel
_____________
Computer Architektur
2. Ein Stromkreis mit Batterie (V1), Schalter (S1) und Lampe (L1). Ist der Schalter in der oberen
Position, so fliesst ein Strom und die Lampe leuchtet, andernfalls nicht. Die Schaltung hat also genau
zwei Zustände. Die Auflistung aller Zustände nennen wir Wahrheitstabelle. Nach der Figur ist die
Wahrheitstabelle für diese Schaltung gezeigt.
S1
L1
+ V1
10V
Wahrheitstabelle
Schalter S1
Lampe L1
1
1
0
0
Logik
Logik mit 0 und 1 bezeichnet man als Bool'sche Algebra. Es gibt drei grundlegende logische
Zusammenhänge in der Bool'schen Algebra:
Seite 2
Computer Architektur
Symbole für logische Verknüpfungen:
Beispiel: UND – Verknüpfung mit zwei Schaltern realisiert:
S1
S2
L1
+ V1
10V
Aufgabe:
Realisieren Sie eine ODER – Schaltung mit zwei Schaltern und zeichnen Sie das Schaltschema:
Aufgabe:
Formulieren Sie die Funktionsweise der Schlösser mit Hilfe der Verknüpfungen UND, ODER und NICHT:
Die Kiste ist offen, wenn Schloss
.____________________________________________________________________________________
.____________________________________________________________________________________
offen ist.
Seite 3
Computer Architektur
Takt
Eine einfache Taktschaltung:
Über einen Widerstand wird ein Kondensator geladen. Ist er geladen, wird er wieder entladen und der
andere Kondensator wird geladen, usw. Die Dauer eines Taktes wird bestimmt durch das Produkt von
Kapazität des Kondensators mal Widerstand. Im Experiment ist das ca. 1 Sekunde:
1000 F . 1 k = 1 s.
Einmal pro Sekunde ist also unsere Takt - Frequenz. Das nennen wir ein Hertz. Tausend Hertz (Hz) ist
ein Kilohertz (kHz), eine Million Hertz ist ein Megahertz (MHz) und eine Milliare Hertz ist ein Gigahertz
(GHz).
Bei gegenwärtigen Prozessoren ist die Taktfrequenz bei ca. 100 MHz. Ein einzelner Takt dauert demnach
ca. ________________________________.
Speicher
Ein einfacher Speicher:
Unsere Speicherschaltung kann genau einen von zwei Zuständen einnehmen. Ist der Zustand so, dass
am Ausgang Q eine Eins ist, so sagen wir, in unserem Speicher sei eine Eins gespeichert, andernfalls
eine Null. Eine von zwei Möglichkeiten ist die kleinste Informationsmenge, die es gibt. Wir nennen sie bit.
Wenn wir zwei solche Speicher kombinieren, so kann jeder eine 1 oder 0 speichern: Insgesamt gibt es 4
mögliche Zustände: 2 bit Information ist also eine von 4 Möglichkeiten:
Anzahl bit
0
1
2
3
4
5
6
7
8
------------------------------------------------------------------------------------------------------------------------------------------Anzahl Möglichkeiten 1
2
4
...
...
...
...
...
...
Seite 4
Computer Architektur
Zahlensysteme
Unser Zahlensystem funktioniert nicht in der Digitaltechnik, weil es mit 10 Ziffern (eine von 10
Möglichkeiten) arbeitet. Wir müssen umrechnen in ein System mit nur 2 Ziffern (0 und 1):
Dezimal
Dual
Hexadezimal
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
__________________
__________________
__________________
__________________
__________________
__________________
__________________
__________________
__________________
__________________
__________________
__________________
__________________
__________________
__________________
__________________
__________________
__________________
________
________
________
________
________
________
________
________
________
________
________
________
________
________
________
________
________
________
31
32
33
__________________
__________________
__________________
________
________
________
64
__________________
________
128
__________________
________
255
256
__________________
__________________
________
________
Der ASCII Code
Bisher haben wir gesehen, wie Zahlen mit lauter 0 und 1 dargestellt werden können mit Hilfe des dualen
Zahlensystems. Ein Computer muss aber auch mit Zeichen umgehen können. Für jedes Zeichen braucht
unser PC acht bit. Er kann also ______________ verschiedene Zeichen voneinander unterscheiden. Die
Zuordnung zwischen den acht bit und einem Zeichen heisst Code. Sehr verbreitet ist der American
Standard Code for Information Interchange (ASCII):
(Bit Nummer 7 ist beim Standard Code null. Ist bit Nummer 7 eins, können noch einmal 128 Zeichen
verschlüsselt werden. Diese Verschlüsselung ist aber nicht einheitlich. Das liefert all die Probleme mit
äöü, etc.!)
Seite 5
Computer Architektur
Aufgabe:
Entschlüsseln Sie folgende ASCII Codes:
1.
0101 0011 0100 1111 0101 0011
2.
53 6F 65
Seite 6
Computer Architektur
2. Der Hauptspeicher
110100001010011011110110001110100001010011011110110001110100001010011011110110001110
100001010011011110110001110100001010011011110110001110100001010011011110110001110100
001010011011110110001110100001010011011110110001110100001010011011110110001110100001
010011011110110001110100001010011011110110001110100001010011011110110001110100001010
011011110110001110100001010011011110110001110100001010011011110110001110100001010011
So ähnlich sieht es im Hauptspeicher (RAM) eines PC aus. Lauter Nullen oder Einsen! Beim 1 - bit Speicher haben wir gesehen, wie eine Speicherstelle elektronisch realisiert wird. Die Frage ist nur, welche
Ordnung im Hauptspeicher herrscht. Dabei gibt es zwei wichtige Dinge: Die bits haben nur für ein
Programm, das im Hauptspeicher abläuft eine Bedeutung. Und: Ein Programm muss eine bestimmte
Position im Speicher durch Adressierung bezeichnen können.
Bedeutung:
Die Bitkombinationen bedeuten für ein Computerprogramm eines der folgenden drei Dinge:

Zahlen (dual)

Zeichen (ASCII)

Befehle (Maschinensprache).
Die ersten beiden Bedeutungen kennen wir bereits, die dritte wird später erklärt.
Adressierung:
Im Hauptspeicher werden immer 8 bit (= 1 Byte) zusammengefasst. Jedes solche "Päckli" von bits hat
eine Adresse. Man könnte also den Hauptspeicher etwa folgendermassen schematisch darstellen:
Adresse:
Speicherstelle mit Inhalt:
0
1
2
.
.
9
A
B
.
F
10
11
.
.
FFFFE
FFFFF
11011011
11011011
11011011
11011011
11011011
11011011
11011011
11011011
11011011
11011011
11011011
11011011
11011011
11011011
11011011
11011011
Aus wievielen bit besteht die grösste Adresse, also FFFFF?
Länge der Adressen in bit: ___________________________.
Seite 7
Computer Architektur
Die Prozessoren 8088 / 8086 / 80286 konnten nur 16 bit adressieren. Das ergibt eine Speichergrösse von
__________________ Byte. Für grössere RAM müssen die restlichen bit mit Hilfe eines Tricks
angesprochen werden: Die effektive (physikalische) Adresse besteht aus der Summe zweier logischer 16
bit Adressen:
Segment- und Offset - Adresse:
Wenn wir eine physikalische Adresse angeben, geben wir Segment- und Offsetadresse an, getrennt
durch einen Doppelpunkt:
0012:000F
Dies ergibt die physikalische Adresse _________________________________________________.
Die Physikalische Adresse hat 20 bit. Dies bedeutet, dass ein 16 bit Prozessor direkt bis zu 1 Mega Byte
RAM adressieren kann.
So, jetzt ist es an der Zeit, dass Sie sich im Hauptspeicher etwas umsehen und prüfen ob Sie das, was
Sie sehen mit dem bisher gesagten in Einklang bringen können:

Sitzen Sie an einen PC und starten Sie ihn.

Wählen Sie im Startmenü „Programme“ und „MS-DOS-Eingabeaufforderung“.
Sie haben ein schwarzes Fenster geöffnet, in welchem Sie Befehle für das Betriebssystem MS-DOS
eingeben können. In neueren Windows – Versionen ist dieses Betriebssystem nicht mehr vorhanden und
wird dort nur noch simuliert. Sie können Ihren PC auch ohne Windows, nur mit dem Betriebssystem MSDOS laufen lassen, indem Sie „Start“, „Beenden“, „Im MS-DOS Modus neu starten“ wählen.

Geben Sie folgenden Befehl ein:
debug
(am Schluss Eingabetaste drücken!)
Damit ist das Programm namens DEBUG gestartet. DEBUG ist Bestandteil des Betriebssystems MSDOS und ist gedacht als Hilfe bei der Fehlersuche (debug heisst "entkäfern!). Geben Sie hinter dem
Bindestrich ein:
Seite 8
Computer Architektur
-d500:0
d steht für DUMP. Die Zahlen stehen für eine Speicherstelle (Segmentadresse : Offsetadresse).

Versuchen Sie die Bildschirmausgabe zu interpretieren.

Geben Sie DUMP auch mit andern Adressen ein.

Gelingt es Ihnen, den selben Speicherbereich auf zwei verschiedene Arten zu adressieren?

Notieren Sie sich auftauchende Fragen:
____________________________________________________________________________________
____________________________________________________________________________________
____________________________________________________________________________________
Haben Sie bemerkt, dass die Bildschirmausgabe von DUMP folgendermassen zu interpretieren ist?:
Adresse der ersten
Speicherstelle in
der Zeile:
0000:0000
0000:0010
0000:0020
0000:0030
0000:0040
0000:0050
0000:0060
0000:0070

Speicherinhalt hexadezimal,
16 Byte pro Zeile, Bindestrich
nach 8 Byte:
Speicherinhalt w.
m. interpretiert
als ASCII:
9E 0F C8 00 65 04 70 00-16 00 EC 09 65 04 70 00 ....e.p.....e.p.
65 04 70 00 54 FF 00 F0-80 B5 00 F0 6F EF 00 F0 e.p.T.......o...
00 00 00 C8 D2 08 CA 0A-6F EF 00 F0 6F EF 00 F0 ........o...o...
6F EF 00 F0 6F EF 00 F0-9A 00 EC 09 65 04 70 00 o...o.......e.p.
05 00 75 C8 4D F8 00 F0-41 F8 00 F0 27 25 5F FD ..u.M...A...'%_.
39 E7 00 F0 40 02 B4 06-2D 04 70 00 28 0A B7 07 [email protected].(...
A4 E7 00 F0 2F 00 AF 0A-6E FE 00 F0 04 06 B7 07 ..../...n.......
1D 00 00 C8 A4 F0 00 F0-22 05 00 00 12 22 51 04 ........"...."Q.
Sehen Sie sich z.B. die letzten 16 Byte des Hauptspeichers an. Haben Sie das Datum im ASCII - Teil
des Bildschirms gesehen? An diesem Datum wurde das sogenannte BIOS Ihres Computers
"gemacht". Das BIOS ist ein Programm, welches permanent im Hauptspeicher vorhanden ist. Das
scheint ein Widerspruch zu sein, denn sobald Sie den Computer ausschalten, geht sämtliche
Information des RAM verloren! Der Hauptspeicher besteht aber eben nicht nur aus RAM ( = Random
Access Memory = Speicher so, wie wir ihn auf Seite 6 kennengelernt haben), sondern auch aus ROM
( = Read Only Memory = Speicher nur zum lesen, dafür Information aber auch ohne Strom
gespeichert ). Und wie Sie in der Tabelle unten sehen, ist das BIOS ROM bei den höchsten Adressen:
Aufteilung des RAM Speichers für DOS:
Blöcke Adresse
15
13-14
12
11
10
0-19

F000:0000 –
D000:0000 –
C000:0000 –
B000:0000 –
A000:0000 –
0000:0000 –
Inhalt
F000:FFFF
E000:FFFF
C000:FFFF
B000:FFFF
A000:FFFF
9000:FFFF
BIOS PROM
frei
BIOS
Video RAM
zusätzliches Video RAM
RAM
Sehen Sie sich im BIOS etwas um! Um jeweils "weiterzublättern" zu den nächsten Adressen können
Sie d ohne Adresse eingeben - das geht schneller.
Seite 9
Computer Architektur
DEBUG Anweisungen:
Nebst dem Anzeigen von Speicherinhalt kann der Debuger noch mehr. Z.B.:
DEBUG Anweisungen:
Eingabe:
Befehlsname:
Beispiel:
-d
-h
-e
-q
DUMP
HEX
ENTER
QUIT
-dF000:FFF0
-hF7B A4E
-B000:80A8
-q
-r
-t
-n
-w
-u
-g
REGISTER
TRACE
NAME
WRITE
UNASSEMBLE
GO
-rcs
-t
-nzeichen
-w
-u100
-g

HEX addiert und Subtrahiert zwei Hexadezimalzahlen - versuchen Sie's!

ENTER ermöglicht das Eingeben von Werten an bestimmten Speicherstellen. Zuerst wird der
bisherige Inhalt angezeigt. Dahinter können Sie den neuen Inhalt eintippen. Betätigen Sie nach dem
Tippen die Leertaste, so können Sie die nächste Speicherstelle verändern, betätigen Sie die
Eingabetaste, so wird ENTER abgeschlossen. Verändern Sie ruhig irgendwelche Speicherstellen,
seien Sie aber nicht erstaunt, wenn der Rechner dabei abstürzt! Versuchen Sie auch, den ROM Bereich zu verändern!

QUIT: Mit diesem Befehl verlassen Sie DEBUG.
( Die weiteren Befehle werden im Zusammenhang mit Maschinenprogrammen erläutert. )
Das Video RAM
Sie erkunden nachfolgend das Vidoe RAM von DOS, obschon die Ansteuerung des Bildschirmes unter
einem grafischen System wie Windows anders vor sich geht. Ich denke aber, dass Sie bei dieser
Erkundung Grunzätze erleben, die Ihnen in anderen Zusammenhängen sehr hilfreich sind.
Für diese Übung müssen Sie Windows verlassen und den PC im MS-DOS Modus starten wie oben
beschrieben.

Falls auf dem Bildschirm schon einiges steht, geben Sie den MS - DOS Befehl CLS ( = Clear Screen
= lösche Bildschirm ) ein. Damit haben Sie "tabula rasa" auf dem Bildschirm und sind bereit, diesen
zu erkunden. Für diese Erkundung starten Sie wieder DEBUG und speichern mit ENTER an der
Adresse B000:809E den Wert 2A. Sehen Sie den Stern oben rechts am schwarzen Himmel Ihres
Bildschirmes? Wenn nein, dann rufen Sie mich bitte. Wenn ja, dann überprüfen Sie, was das 2A
bedeutet, das Sie eingegeben haben und die 20, die vorher abgespeichert war mit Hilfe der ASCII Tabelle Seite 5.
Seite 10
Computer Architektur

Geben Sie an der Adresse B000:809E den Wert 2B ein. Haben Sie das Pluszeichen?
Sie sehen, dass Sie jedes ASCII Zeichen darstellen können, indem Sie es an diese Speicheradresse
schreiben.

Geben Sie an der Adresse B000:809C den Wert 2A ein. Vor dem Pluszeichen ein Stern?
Sie sehen, dass jede zweite Speicheradresse einer Stelle auf dem Bildschirm entspricht.

Spielen Sie mit andern Adressen und andern Zeichen! Wie wär's z.B., wenn Ihre Initialen mitten auf
dem Bildschirm zu sehen wären?
Das Video RAM beginnt bei B000:8000 und endet bei B000:8F9F, wobei die Zeichen in den geraden
Speicherplätzen sind und die Zeilen von links nach rechts und von oben nach unten der Reihe nach im
Speicher sind. Das ergibt den Standart Textschirm von DOS mit 25 Zeilen mal 80 Zeichen, also
insgesamt 2000 Zeichen.

Was ist aber mit den ungeraden Speicherstellen. Das sollen Sie testen. Stellen Sie sicher, dass Sie
oben rechts auf dem Schirm zwei Zeichen haben, „*+“ zum Beispiel. Geben Sie dann an der Adresse
B000:809D den Wert 87 ein: Das zweithinterste Zeichen sollte blinken. Oder dann an der Adresse
B000:809F den Wert 01: Das hinterste Zeichen sollte blau sein.
Des Rätsels Lösung: Die ungeraden Bytes enthalten das Attribut des Zeichens davor! In der Hexziffer
rechts steht die Vordergrundfarbe, in der links die Hintergrundfarbe. Mit einer Ausnahme: Das
höchstwertige bit im Byte schaltet das Blinken ein und aus. Für die Hintergrundfarbe stehen also nur 3 bit
zur Verfügung.

Ihrem Spieltrieb sollten jetzt keine Grenzen gesetzt sein! (Noch ein Tip: Die Taste <F3> holt Ihre letzte
Eingabe erneut auf den Schirm, was die Arbeit sehr erleichtert. Sie können diese Taste übrigens auch
beim Eingeben von MS - DOS - Befehlen verwenden.
Seite 11
Computer Architektur
Der Zugriff auf das RAM in Digitaltechnik:
Digitaltechnik im Internet:
Wählen Sie:
http://www.e-online.de/




Repetieren Sie im Bereich „Digitaltechnik“, „Logische Grundverknüpfungen“.
Arbeiten Sie sich im Bereich „Digitaltechnik“, „Rechenschaltungen“ in das Thema Arithmetik mit
Digitalstechnik ein.
Wenn Sie Lust haben, können Sie sich auch im Bereich „Speicher ...“ etwas genauer die FlipFlops
ansehen.
Die verschiedenen Typen von Halbleiterspeichern finden Sie unter „Computertechnik“, „Grundlagen“.
Zwei bit Addierer:


Bauen Sie mit dem Elektronikkasten einen zwei - bit Addierer auf.
Testen Sie den Addierer und damit Ihre Kenntnisse des dualen Zahlensystems.
Infos über Hardware:
http://www.tomshardware.de
Seite 12
Computer Architektur
3. CPU
Eine Zentraleinheit (CPU) sieht schematisch folgendermassen aus:
Als konkrete Hardware, der Athlon von AMD:
Seite 13
Computer Architektur
Die 16 Bit Register der 80X86 Prozessorfamilie:
Ab 80386 sind die Register (ausser Segmentregister) 32 bit breit, können aber weiter als 16 bit Register
verwendet werden.
Der Speicherzugriff über die Register:
Seite 14
Computer Architektur
Die Verbindungen eines Prozessors nach aussen:
Aktuelle Informationen über aktuelle Prozessoren:
Intel Pentium:
http://www.intel.com/
Das Datenblatt zum Pentium 4:
http://developer.intel.com/design/Pentium4/datashts/ (.pdf Datei mit 25 Mbyte!)
AMD, die Konkurrenz:
http://www.amd.com/
Der Athlon Prozessor:
http://www.amd.com/products/cpg/cpg.html
Seite 15
Computer Architektur
4. Maschinensprache
In diesem Kapitel lernen Sie die Maschinensprache der 80x86 Prozessorfamilie kennen. Ziel ist, zu
erkennen, was eine Maschinensprache ist und die Grundlage für die anschliessende Assembler Programmierung zu legen.
Das Maschinensprachprogramm, das aus einem einzigen Befehl besteht:

Öffnen Sie wieder ein DOS - Fenster und geben Sie den Befehl DEBUG ein.

Sehen Sie sich den Anfang des Segmentes 5000 an mit
-d5000:0

Sind alle Speicherinhalte null? Wenn nicht, dann rufen Sie mich! Andernfalls tippen Sie jetzt das
Programm in Maschinensprache ein:
-e5000:0<Eingabetaste>

a3<Leertaste>
50<Leertaste>
05<Eingabetaste>
Und jetzt schauen Sie sich Ihr erstes Maschinensprachprogramm gemütlich nochmals an:
-d5000:0
Die ersten drei Bytes sollten Ihr Programm (A3 50 05) enthalten!

Bevor Sie Ihr umwerfendes Programm starten können, müssen Sie den Inhalt einiger Register
verändern. Den Inhalt aller Prozessorregister zeigt Ihnen DEBUG, wenn Sie eingeben:
-r

Den Inhalt einzelner Register ändern Sie auch mit dem Befehl -r ( = REGISTER), gefolgt vom
Registernamen. Ändern Sie den Inhalt des Code - Segment - Registers, indem Sie tippen
-rcs<Eingabe>

5000<Eingabe>
Überprüfen Sie mit dem Befehl R, ob das CS - Register wirklich 5000 enthält. Jetzt setzen Sie den
Instruction Pointer auf null:
-rip<Eingabe>

0<Eingabe>
IP und CS zeigen nun zusammen auf Ihren Maschinensprachbefehl! Jetzt verändern Sie den Inhalt
des Daten - Segment - Registers:
-rds<Eingabe>

Damit zeigt das Daten - Segment auf den Anhang des Video - RAM! Zuletzt muß noch das AX Register geladen werden:
-rax<Eingabe>

b800
742a<Eingabe>
Der Inhalt dieses Registers ist der ASCII - Code des Zeichens, das wir auf den Bildschirm schreiben
wollen und sein Attribut. Mit dem Befehl t (TRACE) können Sie ein Programm Befehl um Befehl
laufen lassen. Da Ihr Programm nur aus einem Befehl besteht, ist nur ein TRACE - Befehl möglich.
Geben Sie also ein
-t
Seite 16
Computer Architektur
Ist der rote Stern auf weissem Grund irgendwo auf dem Schirm zu sehen? Herzliche Gratulation: Sie
haben Ihr erstes Programm in Maschinensprache geschrieben und erfolgreich getestet!
Wir wollen den Befehl dieses ersten Programmes analysieren. Vergleichen Sie mit der nachfolgenden
Tabelle "Maschinencode":

In der Tabelle, in der Kolonne "1. Byte" steht der Befehl hexadezimal. In unserem Falle ist es der
Befehl A3. Was der tut, ersieht man aus der Kolonne "Mnemonik": Hier steht der Name des Befehls in
einigermassen menschlicher Sprache. In unserem Falle steht MOV, Abkürzung für "move", zu
deutsch "verschiebe". Der Maschinenbefehl MOV verschiebt also den Inhalt einer Speicherstelle an
eine andere.

Von wo wohin verschoben wird, das steht hinter dem Befehl. In unserem Falle "addr,AX". Das
bedeutet: Aus dem Register AX in den RAM Speicher an die Adresse "addr". Verschiebungen etc.
verlaufen immer von rechts nach links!

Wo aber ist "addr" angegeben? Diese Adresse steht im 2. und 3. Byte, also direkt hinter dem Befehl.
In der Tabelle ist das mit "pp" und "qq" symbolisch dargestellt, indem jeder Buchstabe für eine
hexadezimale Ziffer steht. "pp" ist dabei das höherwertige Byte als "qq", wir würden also schreiben
"ppqq", in unserem Falle 0550!

Wohin im physikalischen RAM wird nun also der Inhalt des Registers AX verschoben? Sie haben mit
„rds“ in das Daten Segment Register den Wert b800 geladen, die Physikalische Adresse ist also
b800:0550, irgendwo im Video RAM, wie Sie sehen, wenn Sie mit dem Kapitel über das RAM
vergleichen.

Und was wird verschoben? Eben der Inhalt des Registers AX, das Sie mit 742a geladen haben.
Genau an die Adresse kommt das rechte Byte (2a), also der ASCII Code für „*“, an die nächste Stelle,
in das Attribut - Byte, kommt das linke Byte (07), also die Bitkombination für rotes Zeichen (4) auf
weissem Hintergrund (7).
Ab jetzt ist pröbeln erwünscht. Dazu einige Hinweise:

Der Befehl TRACE führt genau einen Maschinenbefehl aus und erhöht dabei den IP so, dass dieser
auf den nächsten Befehl zeigt.

Setzen Sie daher den IP immer wieder auf null, wenn Sie Ihr Programm erneut laufen lassen wollen.

Variieren Sie das Zeichen, sein Attribut und seine Position
Wichtige Befehle in Maschinensprache:
MOV
ADD
SUB
MUL
DIV
INC
DEC
OR
AND
XOR
CMP
R..
S..
JMP
J..
Move
Add
Subtract
Multiply
Divide
Increment
Decrement
Or
And
Excl. Or
Compare
Rotate
Shift
Jump
Jump
Verschiebe
Addiere
Subtrahiere
Multipliziere
Dividiere
Erhöhe um eins
Erniedrige um eins
Logisches Oder
Logisches Und
Exklusives Oder
Vergleiche
Rotiere um 1 bit
Verschiebe um 1 bit
Springe nach
bedingter Sprung
Maschinensprache der 80x86 Prozessorfamilie:
Seite 17
Computer Architektur
Seite 18
Computer Architektur
Seite 19
Computer Architektur
Seite 20
Computer Architektur
Seite 21
Computer Architektur
Aufgaben:
1.
Verändern Sie das Programm von vorher so, dass der Stern eine Stelle weiter rechts blinkt.
2.
Jetzt soll der Stern am Anfang einer Zeile blinken.
Hinweis: Die erste Zeile ist natürlich am einfachsten. Aber da müssen Sie mit -q aus Debug aussteigen,
mit CLS den Bildschirm löschen und mit DEBUG wieder einsteigen. Dabei bleibt das Programm erhalten,
nicht aber die Registerinhalte! Für einen andern Zeilenanfang sehen Sie bitte nach wie viele Byte einer
Zeile entsprechen. Ein Beispiel: Die Hex. - Zahl 500 entspricht dezimal 1280. Und das dividiert durch
dezimal 160 gibt 8!
3.
Anstatt des Sterns soll der Anfangsbuchstabe Ihres Vornamens grün blinken.
4.
Das Zeichen und das Attribut könnte eigentlich auch das Programm ins AX - Register schreiben. Also
ein Programm mit zwei Maschinenbefehlen: Zuerst Zeichen und Zahl ins AX (ich empfehle den Befehl b8,
auch ein MOV - Befehl!) und dann wie vorher. Denken Sie daran, -t zweimal auszuführen!
5.
Und nun noch Ihre Initialen! Also zwei Zeichen schreiben: Nach dem Schreiben des ersten Zeichens das
zweite mit b8 ins AX verschieben und dann mit a3 an die übernächste Stelle im Bildschirmspeicher
verschieben. Probieren Sie's aus, es geht, aber wegen dem Scrollen ist das erste Zeichen schon
verschoben, wenn das zweite erscheint. Dem helfen wir ab, indem wir das Programm als ganzes laufen
lassen: Merken Sie sich, welche Zahl am Ende des Programms (nach dem letzten Trace) im IP Register
ist (bei mir ist das 000C). Stellen Sie den IP auf null und starten Sie das Programm mit dem Debug Befehl GO. Hinter dem Befehl müssen Sie angeben, wo Ihr Programm zu Ende ist, sonst wird der ganze
restliche Speicherinhalt als Programm ausgeführt - und das gibt wohl sicher einen Crash! Sie geben also
die Zahl, die Sie sich soeben gemerkt haben hinter -g ein. Ich z.B. starte mein Programm mit -g00c oder
auch einfacher mit -gc. Sie können GO auch sagen, wo Ihr Programm beginnt, dann ist die Sache mir -rip
nicht mehr nötig: -g=0 c
6.
Jetzt können Sie Ihr Programm weiter ändern (einen ganzen Text schreiben lassen z.B.) oder sich auch
was ganz anderes ausdenken (z.B. zwei Zahlen subtrahieren; Achtung: Unsere Programme können noch
nichts mit einer Tastatur anfangen. Also müssten die zu berechnenden Zahlen entweder im Programm
oder in Registern sein). Viel Spass beim Pröbeln! Und: Falls dabei etwas interessantes herausgekommen
ist, bringen Sie es mit -d auf den Bildschirm und drucken Sie es (falls Sie Windows verlassen haben,
indem Sie die Taste "Printscreen" drücken, fall Sie ein DOS Fenster haben mit Copy und Paste in den
Windows Editor).
7.
Und noch ein Programm zum Studieren und Ausprobieren:
-d1000:0
1000:0000
1000:0010
1000:0020
1000:0030
1000:0040
1000:0050
1000:0060
1000:0070
-
B8
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
B8
FF
00
00
00
00
00
00
8E
C0
00
00
00
00
00
00
D8
FF
00
00
00
00
00
00
B9
C3
00
00
00
00
00
00
FF
FF
00
00
00
00
00
00
00-B8
C3-E2
00-00
00-00
00-00
00-00
00-00
00-00
00
F4
00
00
00
00
00
00
5A
00
00
00
00
00
00
00
BB
00
00
00
00
00
00
00
00
00
00
00
00
00
00
00
05
00
00
00
00
00
00
00
89
00
00
00
00
00
00
00
80
00
00
00
00
00
00
00
..........Z.....
................
................
................
................
................
................
................
Wenn Sie das Programm eingetippt haben, können Sie es starten, indem Sie das CS (falls nötig) auf
1000 setzen und -g=0 1a eingeben. Es lebe der ASCII - Code!
Seite 22
Computer Architektur
Falls Sie das Programm behalten wollen, gehen Sie folgendermassen vor: Setzen Sie BX auf null und CX
auf 1a, denn BX:CX gibt an, wieviele Byte aus dem RAM in eine Datei geschrieben werden. Jetzt
bestimmen Sie den Namen der Datei mit dem Debug - Befehl Name, z.B. -nzeichen (die Datei heisst
dann ZEICHEN). Anschliessend geben Sie den Debug - Befehl Write ein: -wcs:0. Es werden auf dem
Code - Segment ab Adresse 0 1a Byte in die Datei ZEICHEN geschrieben!
Verlassen Sie jetzt Debug und geben Sie auf der DOS - Ebene den DOS - Befehl DIR ein. Er zeigt Ihnen
alle Dateien des aktuellen Verzeichnisses - ZEICHEN sollte dabei sein! Falls das aktuelle Verzeichnis
nicht Ihr privates ist, nämlich L:, dann kopieren Sie ZEICHEN dorthin mit dem DOS - Befehl COPY:
COPY ZEICHEN L:
Sie können jetzt ausprobieren, ob alles geklappt hat: Starten Sie Debug. Suchen Sie mit -d (Dump) einen
Speicherbereich, der leer ist, z.B. -d6000:0. Setzen Sie CS auf diesen Bereich, legen Sie den Namen fest
mit -nzeichen und laden Sie die Datei mit dem Load - Befehl: -lcs:0. Kontrollieren Sie mit -d! Starten Sie
das Programm mit -g=cs:0 1a. Voilá, Sie besitzen ein Programm, das direkt in Maschinensprache
geschrieben wurde und das alle ASCII - Zeichen auf den Bildschirm bringt.
Das war der schwierigste Teil unseres Kurses. Programmieren in Maschinensprache heisst, sich ganz
auf die "Denkweise" des Computers einzustellen und nur hexadezimal mit dem Computer zu
kommunizieren. Leider war das nicht ganz in "Reinkultur" möglich, denn um unsere Programme ins RAM
zu bringen und sie zu starten hatten wir bereits ein "Hilfsprogramm", den Debuger, nötig (und da gab's ja
neben den Hexzahlen schon Buchstaben wie -d, -e, -g, etc. Ich wollte Ihnen damit einmal mehr die
Grundstrukturen des Computers zeigen. Jede höhere Programmiersprache bzw. -umgebung ist ein
Hilfsmittel, welches die Arbeit des Programmierers vereinfacht. Das Endprodukt wird aber immer ein
Programm in Maschinensprache sein. Sie erkennen Dateien, die Programme in Maschinensprache
enthalten an der Endung .COM oder .EXE unter DOS. Unter Windows können Dateien, die Teile eines
Maschinensprachprogramms enthalten auch andere Endungen haben (.DLL, etc.). Übrigens habe ich für
unser Programm absichtlich keine Endung vorgesehen, weil es zwar ein vollständiges
Maschinensprachprogramm ist, sich aber nur mit Hilfe des Debugers starten lässt. Programme mit den
Endungen .COM oder .EXE kann man direkt von der DOS Ebene aus starten, indem man einfach ihren
Namen eingibt. Sie haben das gemacht mit dem Programm namens DEBUG.COM. Es befindet sich im
Verzeichnis C:\Windows\Command. Dort sind alle Programme, die zum Betriebssystem gehören ausser
denjenigen, die schon im RAM sind. Sie können sich das folgendermassen ansehen:
Schalten Sie wenn nötig auf die lokale Festplatte um:
Wechseln Sie ins Hauptverzeichnis mit Change Directory:
Wechseln Sie ins Verzeichnis Command:
Zeigen Sie sich die Namen der Dateien an:
Zeigen Sie sich die Dateien seitenweise an:
Haben Sie DEBUG gefunden? Nein? Dann:
Sie wollen wissen, was diese Programme machen?:
C:
CD \
CD WINDOWS\COMMAND
DIR
DIR /P
DIR DEBUG.*
HELP
Das war noch so ein kleiner DOS - Kurs. Wenn Sie mehr wissen möchten, dann sagen Sie es mir!
Seite 23
Computer Architektur
Der Einplatinencomputer CT-65
Was eine Sprache ist, merkt man erst, wenn
man deren zwei gelernt hat. Das ist bei
Maschinensprachen nicht anders. Deshalb
sollen Sie mit einer andern
Maschinensprache ebenfalls etwas
herumpröbeln. Es handelt sich um diejenige
des Prozessors 6502, eines Vorläufers
derjenigen Prozessoren, die heutzutage im
Mac zu finden sind.Gleichzeitig sollen Sie
Ihre Hardwarekenntnisse etwas repetieren
und den Aufbau eines Computers auf einen
Blick erfassen.
Prinzipaufbau des Computers:
Die Tastenbefehle des Monitors (=Betriebssystem):
A
E
B
G
R
S,L
I
IB
IC
ID
IE
IF
Adress
Inhalt einer Speicheradresse anzeigen
Enter
Inhalt einer Speicheradresse ändern und Adresse inkrementieren
Backspace
Speicheradresse dekrementieren
Go
Programm starten an angezeigter Adresse
Reset
Save, Load
Programm speichern, laden
Index
Neubelegung der Hex Tasten:
Umrechnung in relative Adressen
Blockverschieben
Systemuhr anzeigen
Programmstart bei E000
Systemuhr setzen
Speicherbelegung:
Seite 24
Computer Architektur
Die Sprache des 6502
Die wichtigsten Maschinenbefehle:
Seite 25
Computer Architektur
5. Assembler
Der Assembler ist ein Übersetzungsprogramm. Er übersetzt ein Programm, das wir Programmierer
nicht in Machinensprache schreiben wollen in die Maschinensprache. Die Sprache, in der wir das
Programm schreiben heisst ebenfalls Assembler. Assembler ist für den Computer die zweiteinfachste
Sprache, die einfachste ist natürlich die Maschinensprache, also seine eigene.
Sprachen, die noch näher an unserem menschlichen Denken sind als der Assembler nennt man häufig
höhere Programmiersprachen (Basic, Pascal, C, Fortran, Forth, Modula, Java und wie sie alle heissen).
Soll ein Programm auf einem Computer ausgeführt werden, muss es immer in Maschinensprache
vorhanden sein. Ausser einem Programm in Maschinensprache muss also jedes Programm zuerst
übersetzt werden. Bei einem Assemblerprogramm heisst dieser Vorgang assemblieren, bei allen andern
entweder kompilieren (ganzes Programm übersetzen) oder interpretieren (Übersetzung einer Zeile und
dann gleich Ausführung). Sie haben eigentlich die Assemblersprache schon etwas kennengelernt: Die
Kürzel für die Maschinenbefehle in den Tabellen (MOV, ADD, etc.) sind Assemblerbefehle. Die
einfachsten Assembler machen also nichts anderes als wir, wenn wir in den Tabellen nachsehen: MOV
durch B8 ersetzen, etc. Wie wir gleich sehen werden, kann ein ausgewachsener Assembler aber noch
wesentlich mehr.
Ein wichtiger Punkt ist der, dass die Beziehung zwischen Assembler und Maschinensprache eineindeutig
ist: Ein Assemblerprogramm kann man eindeutig in Maschinensprache übersetzen und dann eindeutig
wieder zurück in Assembler. Dieser letzte Vorgang heisst unassemble. Das ist etwas, was sogar unser
gutes Debug kann. Der entsprechende Debug Befehl heisst -u. Sehen Sie sich das folgende Listing dazu
an:
-u0
5000:0000
5000:0003
5000:0005
5000:0008
5000:000A
5000:000C
5000:000E
5000:0010
5000:0011
5000:0012
5000:0014
5000:0016
5000:0018
5000:001A
5000:001C
5000:001E
-
A35005
00EB
157650
0000
0000
0000
0000
4D
27
7650
0000
0000
0000
0000
0000
0000
MOV
ADD
ADC
ADD
ADD
ADD
ADD
DEC
DAA
JBE
ADD
ADD
ADD
ADD
ADD
ADD
[0550],AX
BL,CH
AX,5076
[BX+SI],AL
[BX+SI],AL
[BX+SI],AL
[BX+SI],AL
BP
0064
[BX+SI],AL
[BX+SI],AL
[BX+SI],AL
[BX+SI],AL
[BX+SI],AL
[BX+SI],AL
Wieder unser Programm, das aus einem Befehl besteht und ein Zeichen auf den Bildschirm schreibt! Es
steht in der ersten Zeile. Der Rest ist natürlich Chabis. Da war irgendwas im Hauptspreicher und das hat
der Unassembler als Maschinensprache interpretiert. Sie sehen eine Darstellung, wie sie auch meist von
den Assemblern geliefert wird: Links die Speicheradresse, dann der Maschinencode und rechts davon
dasselbe in Assembler.
Seite 26
Computer Architektur
Erstes Assemblerprogramm für den PC:
Damit es nicht allzu langweilig wird, soll Ihr erstes Assemblerprogramm nicht dasselbe machen wie das
Maschinensprachprogramm. Der Assembler - Code ist nachfolgend abgedruckt. Sie geben das
Programm nicht direkt ins RAM mit Debug, sondern schreiben es mit einer Textverarbeitung. Wir könnten
z.B. Word brauchen. Das wäre aber mit Kanonen aus Spatzen geschossen! Wir verwenden das ganz
einfache Textverarbeitungsprogramm Editor aus dem Zubehör im Menü "Start":
-
Starten Sie den Editor und geben Sie das nachfolgende Assemblerprogramm ein (die Kommentare
nach den Strichpunkten können Sie auch weglassen, einrücken mit dem Tabulator).
;
;
;
;
;
;
test.asm
**********************************************************************
Zähler: Liest Ziffer und gibt entsprechende Anzahl Zeilen aus
Übersetzen mit NASM: nasm -f bin test.asm -o test.com
3.11.01 / Sö
**********************************************************************
org 100h
; Code beginnt bei 100h im Code Segment
section .text
; Codebereich:
mov
dx,text1 ; Adresse des Textes 1 nach dx
mov
ah,09 ; Funktion des DOS Interrupt 21 nach ah
; (Textausgabe)
int
21h
; Interrupt 21 ausführen
mov
ah,01 ; Funktion des DOS Interrupt 21 nach ah
int
21h
; Interrupt 21 ausführen
; (Taste lesen)
sub
al,48
; ASCII Ziffer -> Zahl
xor
cx,cx ; cx löschen
mov
cl,al
; al (Zahl) nach cl (Zählerregister)
mov
dx,text2 ; Adresse des Textes 2 nach dx
mov
ah,09 ; IFunktion des DOS Interrupt 21 nach ah
schleife: int
21h
; Interrupt 21 ausführen
; (Textausgabe)
loop
schleife ; Sprung nach schleife solange cx <> 0
; und cx dekrementieren
ret
; zurück ins DOS
start:
text1:
text2:
section .data
; Datenbereich:
db
10,13,'Anzahl Zeilen (1 - 9):','$'
db
10,13,'Computer sind auch nur Menschen!',10,13,'$'
-
Wenn Sie fertig sind, speichern Sie die Datei unter dem Namen test.asm in einem Ordner, in
welchem sich sonst nichtt befindet (ev. neuen Ordner erstellen mit der entsprechenden Taste im
Dateidialog!).
-
Öffnen Sie ein DOS Fenster und wechseln Sie mit CD in den Ordner, in welchem Sie die Datei
gespeichert haben. Sehen Sie sich den Ordner mit DIR an.
-
Jetzt brauchen Sie den Assembler um Ihr Assemblerprogramm in Maschinencode zu übersetzen.
Öffnen Sie dazu z.B. den Windows Explorer und kopieren Sie die Datei nasm.exe vom Server aus
dem Ordner "Fächer", "Informatik", "Assembler", "nasm" in den Ordner, in welchem sich Ihr
Assemblerprogramm befindet.
Seite 27
Computer Architektur
-
Im DOS Fenster übersetzen Sie jetzt Ihr Programm mit
nasm -f bin test.asm -o test.com
(-f bin besagt, dass es sich um ein einfaches DOS Programm handelt und -o gibt den Namen des zu
erstellenden Maschinensprach - Programms an).
-
Wenn Sie keinen Fehler gemacht haben, schreibt Ihnen der nasm nichts, sonst gibt er Ihnen
Fehlermeldungen aus.
-
Geben Sie DIR ein um zu kontrollieren, ob die Datei test.com wirklich erstellt wurde.
-
Führen Sie das Maschinensprache - Programm in der Datei test.com aus, indem Sie eingeben
test
-
Hat's geklappt? Ob Sie mit dem dummen Spruch einverstanden sind oder nicht: Damit haben Sie die
Programmentwicklung mit dem Assembler erlebt:
Quelltext editieren
->
assemblieren
->
ausführen
(wenn's komplexer wird, ist zwischen assemblieren und ausführen noch das Linken durchzuführen).
-
Und dieser Zyklus wird sich natürlich im Normalfall x mal wiederholen. Damit das nicht zu aufwendig
ist geben Sie bitte den DOS Befehl
doskey
ein.
Alle Befehle, die Sie anschliessend eingeben, können Sie mit der Cursor - Taste nach oben wieder
hervorholen!
-
Ändern Sie den blöden Spruch ab, übersetzen Sie und führen Sie aus. Lassen Sie auch mal ,10,13
am Ende des zweiten Textes weg. Weitere Änderungen auf eigene Gefahr!
-
Geben Sie auch mal die Ziffer 0 ein. Hoppla! Aber keine Angst: mit der Tastenkombination
<Ctrl>+<C> können Sie das Programm wieder stoppen.
Warum der unendliche Loop?
-
A propos Verständinis des Programms: Das mit den Interrupts ist noch zu klären, der Rest ist ev. jetzt
schon verständlich. Denken Sie das Programm Schritt für Schritt durch und bereiten Sie Fragen für
die Besprechung vor. Hier die Schlüsselwörter:
start:
_____________________________________________________
mov
dx,text1 _____________________________________________________
mov
ah,09
_____________________________________________________
sub
al,48
_____________________________________________________
xor
cx,cx
_____________________________________________________
mov
cl,al
_____________________________________________________
loop
schleife
_____________________________________________________
ret
___________________________________oder: mov ah,4ch int 21h
section .data
_____________________________________________________
text1:
_____________________________________________________
db
10,13,'Anzahl Zeilen (1 - 9):','$' ______________________________________________
Seite 28
Computer Architektur
Der Assembler, den ich Ihnen da zur Verfügung gestellt habe, ist übrigens Freeware. Wenn Sie ihn zu
Hause haben wollen, kopieren Sie ihn vom Server oder laden Sie ihn von der Homepage von nasm
herunter (ist recht klein!): http://www.web-sites.co.uk/nasm/
Auch bei der Assemblerprogrammierung ist in der x86er Welt Microsoft am meisten am Ball. Der am
meisten verwendete Assembler ist masm. Er ist auf dem Server ebenfalls vorhanden. Er ist aber nicht
Freeware. Und passen Sie auf: Die Maschinenbefehle sind in allen Assemblern die selben, die
Anweisungen an den Assembler selber unterscheiden sich aber.
Viel Info zur Assembler - Programmierung (englisch) finden Sie unter:
http://www.programmersheaven.com/zone5/index.htm
Und Assembler - Links sind zu finden unter: http://code.box.sk/asm.php3
Maschinensprache der x86 Prozessoren:
Intel 80x06 processor opcodes
from the A86 assembler package
compiled by Eric Isaacson
This op-code list is extracted from the A86 assembler package
V3.22, January 25, 1990. Copyright 1986--1990 Eric Isaacson.
All rights reserved.
Opcodes
Instruction
Description
37
D5
D4
3F
14
15
80
10
83
81
11
12
13
AAA
AAD
AAM
AAS
ADC
ADC
ADC
ADC
ADC
ADC
ADC
ADC
ADC
ASCII adjust AL (carry into AH) after addition
ASCII adjust before division (AX = 10*AH + AL)
ASCII adjust after multiply (AL/10: AH=Quo AL=Rem)
ASCII adjust AL (borrow from AH) after subtraction
Add with carry immediate byte into AL
Add with carry immediate word into AX
Add with carry immediate byte into EA byte
Add with carry byte register into EA byte
Add with carry immediate byte into EA word
Add with carry immediate word into EA word
Add with carry word register into EA word
Add with carry EA byte into byte register
Add with carry EA word into word register
04
05
80
00
83
81
01
02
03
0F
0A
0A
ib
iw
/2 ib
/r
/2 ib
/2 iw
/r
/r
/r
ib
iw
/0 ib
/r
/0 ib
/0 iw
/r
/r
/r
20
AL,ib
AX,iw
eb,ib
eb,rb
ew,ib
ew,iw
ew,rw
rb,eb
rw,ew
ADD AL,ib
ADD AX,iw
ADD eb,ib
ADD eb,rb
ADD ew,ib
ADD ew,iw
ADD ew,rw
ADD rb,eb
ADD rw,ew
#ADD4S
Add
Add
Add
Add
Add
Add
Add
Add
Add
Add
immediate byte into AL
immediate word into AX
immediate byte into EA byte
byte register into EA byte
immediate byte into EA word
immediate word into EA word
word register into EA word
EA byte into byte register
EA word into word register
CL nibbles BCD from DS:SI into ES:DI (CL even,NZ)
Seite 29
Computer Architektur
24
25
80
20
83
81
21
22
23
63
ib
iw
/4 ib
/r
/4 ib
/4 iw
/r
/r
/r
/r
AND AL,ib
AND AX,iw
AND eb,ib
AND eb,rb
AND ew,ib
AND ew,iw
AND ew,rw
AND rb,eb
AND rw,ew
*ARPL ew,rw
Logical-AND immediate byte into AL
Logical-AND immediate word into AX
Logical-AND immediate byte into EA byte
Logical-AND byte register into EA byte
Logical-AND immediate byte into EA word
Logical-AND immediate word into EA word
Logical-AND word register into EA word
Logical-AND EA byte into byte register
Logical-AND EA word into word register
Adjust RPL of EA word not smaller than RPL of rw
62
9A
E8
FF
FF
0F
98
F8
FC
FA
/r
cd
cw
/3
/2
FF ib
*BOUND rw,md
CALL cd
CALL cw
CALL ed
CALL ew
#CALL80 ib
CBW
CLC
CLD
CLI
INT 5 if rw not between [md] and [md+2] inclusive
Call far segment, immediate 4-byte address
Call near, offset relative to next instruction
Call far segment, address at EA doubleword
Call near, offset absolute at EA word
Call 8080-emulation code at INT number ib
Convert byte into word (AH = top bit of AL)
Clear carry flag
Clear direction flag so SI and DI will increment
Clear interrupt enable flag; interrupts disabled
0F
0F
0F
0F
0F
F5
3C
3D
80
38
83
81
39
3A
3B
12/0
#CLRBIT eb,CL
13/0
#CLRBIT ew,CL
1A/0 ib #CLRBIT eb,ib
1B/0 ib #CLRBIT ew,ib
06
*CLTS
CMC
ib
CMP AL,ib
iw
CMP AX,iw
/7 ib
CMP eb,ib
/r
CMP eb,rb
/7 ib
CMP ew,ib
/7 iw
CMP ew,iw
/r
CMP ew,rw
/r
CMP rb,eb
/r
CMP rw,ew
Clear bit CL of eb
Clear bit CL of ew
Clear bit ib of eb
Clear bit ib of ew
Clear task switched flag
Complement carry flag
Subtract immediate byte from AL for flags only
Subtract immediate word from AX for flags only
Subtract immediate byte from EA byte for flags only
Subtract byte register from EA byte for flags only
Subtract immediate byte from EA word for flags only
Subtract immediate word from EA word for flags only
Subtract word register from EA word for flags only
Subtract EA byte from byte register for flags only
Subtract EA word from word register for flags only
0F 26
A6
A7
A6
A7
99
#CMP4S
CMPS mb,mb
CMPS mw,mw
CMPSB
CMPSW
CWD
Compare
Compare
Compare
Compare
Compare
Convert
27
2F
FE /1
FF /1
48+rw
F6 /6
F7 /6
C8 iw 00
C8 iw 01
C8 iw ib
DAA
DAS
DEC eb
DEC ew
DEC rw
DIV eb
DIV ew
*ENTER iw,0
*ENTER iw,1
*ENTER iw,ib
Fany
HLT
Decimal adjust AL after addition
Decimal adjust AL after subtraction
Decrement EA byte by 1
Decrement EA word by 1
Decrement word register by 1
Unsigned divide AX by EA byte (AL=Quo AH=Rem)
Unsigned divide DXAX by EA word (AX=Quo DX=Rem)
Make stack frame, iw bytes local storage, 0 levels
Make stack frame, iw bytes local storage, 1 level
Make stack frame, iw bytes local storage, ib levels
Floating point set is in Chapter 7
Halt
IDIV
IDIV
IMUL
IMUL
*IMUL
*IMUL
*IMUL
*IMUL
Signed
Signed
Signed
Signed
Signed
Signed
Signed
Signed
F4
F6
F7
F6
F7
6B
69
69
6B
/7
/7
/5
/5
/r
/r
/r
/r
E4 ib
EC
E5 ib
ED
FE /0
FF /0
40+rw
6C
6D
6C
6D
CC
CD ib
ib
iw
iw
ib
IN
IN
IN
IN
eb
ew
eb
ew
rw,ib
rw,iw
rw,ew,iw
rw,ew,ib
AL,ib
AL,DX
AX,ib
AX,DX
INC eb
INC ew
INC rw
*INS eb,DX
*INS ew,DX
*INSB
*INSW
INT 3
INT ib
Input
Input
Input
Input
CL nibbles CD at DS:SI from ES:DI (CL even,NZ)
bytes ES:[DI] from [SI], advance SI and DI
words ES:[DI] from [SI], advance SI and DI
bytes ES:[DI] from DS:[SI], advance SI and DI
words ES:[DI] from DS:[SI], advance SI and DI
word to doubleword (DX = top bit of AX)
divide AX by EA byte (AL=Quo AH=Rem)
divide DXAX by EA word (AX=Quo DX=Rem)
multiply (AX = AL * EA byte)
multiply (DXAX = AX * EA word)
multiply immediate byte into word register
multiply immediate word into word register
multiply (rw = EA word * immediate word)
multiply (rw = EA word * immediate byte)
byte
byte
word
word
from
from
from
from
immediate port into AL
port DX into AL
immediate port into AX
port DX into AX
Increment EA byte by 1
Increment EA word by 1
Increment word register
Input byte from port DX
Input word from port DX
Input byte from port DX
Input word from port DX
by 1
into
into
into
into
[DI]
[DI]
ES:[DI]
ES:[DI]
Interrupt 3 (trap to debugger) (far call, with flags
Interrupt numbered by immediate byte
pushed first)
Seite 30
Computer Architektur
CE
CF
INTO
IRET
Interrupt 4 if overflow flag is 1
Interrupt return (far return and pop flags)
77
73
72
76
72
E3
74
7F
7D
7C
7E
cb
cb
cb
cb
cb
cb
cb
cb
cb
cb
cb
JA cb
JAE cb
JB cb
JBE cb
JC cb
JCXZ cb
JE cb
JG cb
JGE cb
JL cb
JLE cb
Jump
Jump
Jump
Jump
Jump
Jump
Jump
Jump
Jump
Jump
Jump
short
short
short
short
short
short
short
short
short
short
short
EB
EA
E9
FF
FF
cb
cd
cw
/4
/5
JMP
JMP
JMP
JMP
JMP
Jump
Jump
Jump
Jump
Jump
short (signed byte relative to next instruction)
far (4-byte immediate address)
near (word offset relative to next instruction)
near to EA word (absolute offset)
far (4-byte address in memory doubleword)
76
72
73
77
73
75
7E
7C
7D
7F
cb
cb
cb
cb
cb
cb
cb
cb
cb
cb
JNA cb
JNAE cb
JNB cb
JNBE cb
JNC cb
JNE cb
JNG cb
JNGE cb
JNL cb
JNLE cb
Jump
Jump
Jump
Jump
Jump
Jump
Jump
Jump
Jump
Jump
short
short
short
short
short
short
short
short
short
short
if
if
if
if
if
if
if
if
if
if
not
not
not
not
not
not
not
not
not
not
71
7B
79
75
70
7A
7A
7B
78
74
cb
cb
cb
cb
cb
cb
cb
cb
cb
cb
JNO cb
JNP cb
JNS cb
JNZ cb
JO cb
JP cb
JPE cb
JPO cb
JS cb
JZ cb
Jump
Jump
Jump
Jump
Jump
Jump
Jump
Jump
Jump
Jump
short
short
short
short
short
short
short
short
short
short
if
if
if
if
if
if
if
if
if
if
not overflow (OF=0)
not parity (PF=0)
not sign (SF=0)
not zero (ZF=0)
overflow (OF=1)
parity (PF=1)
parity even (PF=1)
parity odd (PF=0)
sign (SF=1)
zero (ZF=1)
9F
0F
C5
8D
C9
C4
0F
0F
0F
0F
F0
02 /r
/r
/r
/r
01
01
00
01
/2
/3
/2
/6
cb
cd
cw
ew
md
if
if
if
if
if
if
if
if
if
if
if
above (CF=0 and ZF=0)
above=UNSIGNED
above or equal (CF=0)
below (CF=1)
below=UNSIGNED
below or equal (CF=1 or ZF=1)
carry (CF=1)
CX register is zero
equal (ZF=1)
greater (ZF=0 and SF=OF) greater=SIGNED
greater or equal (SF=OF)
less (SF/=OF)
less=SIGNED
less or equal (ZF=1 or SF/=OF)
above (CF=1 or ZF=1)
above or equal (CF=1)
below (CF=0)
below or equal (CF=0 and ZF=0)
carry (CF=0)
equal (ZF=0)
greater (ZF=1 or SF/=OF)
greater or equal (SF/=OF)
less (SF=OF)
less or equal (ZF=0 and SF=OF)
LAHF
*LAR rw,ew
LDS rw,ed
LEA rw,m
*LEAVE
LES rw,ed
Load: AH = flags SF ZF xx AF xx PF xx CF
Load: high(rw) = Access Rights byte, selector ew
Load EA doubleword into DS and word register
Calculate EA offset given by m, place in rw
Set SP to BP, then POP BP (reverses previous ENTER)
Load EA doubleword into ES and word register
*LGDT
*LIDT
*LLDT
*LMSW
LOCK
Load 6 bytes at m into Global Descriptor Table reg
Load 6 bytes at m into Interrupt Descriptor Table reg
Load selector ew into Local Descriptor Table reg
Load EA word into Machine Status Word
Assert BUSLOCK signal for the next instruction
m
m
ew
ew
(prefix)
0F 33/r
#LODBITS rb,rb
0F 3B/0 ib #LODBITS rb,ib
AC
LODS mb
AD
LODS mw
AC
LODSB
AD
LODSW
Load
Load
Load
Load
Load
Load
E2
E1
E0
E0
E1
0F
0F
cb
cb
cb
cb
cb
03 /r
00 /3
noflags DEC CX; jump short if CX/=0
noflags DEC CX; jump short if CX/=0 and
noflags DEC CX; jump short if CX/=0 and
noflags DEC CX; jump short if CX/=0 and
noflags DEC CX; jump short if CX/=0 and
Load: rw = Segment Limit, selector ew
Load EA word into Task Register
A0
A1
8E
8E
C6
88
8E
8E
iw
iw
/3
/3
/0 ib
/r
/0
/0
8C /1
8C /3
C7 /0 iw
LOOP cb
LOOPE cb
LOOPNE cb
LOOPNZ cb
LOOPZ cb
*LSL rw,ew
*LTR ew
MOV
MOV
MOV
MOV
MOV
MOV
MOV
MOV
AL,xb
AX,xw
DS,mw
DS,rw
eb,ib
eb,rb
ES,mw
ES,rw
MOV ew,CS
MOV ew,DS
MOV ew,iw
Move
Move
Move
Move
Move
Move
Move
Move
AX with DS:SI,bit rb (incr. SI,rb), rb+1 bits
AX with DS:SI,bit rb (incr. SI,rb), ib+1 bits
byte [SI] into AL, advance SI
word [SI] into AX, advance SI
byte [SI] into AL, advance SI
word [SI] into AX, advance SI
equal (ZF=1)
not equal
ZF=0
zero (ZF=1)
byte variable (offset iw) into AL
word variable (offset iw) into AX
memory word into DS
word register into DS
immediate byte into EA byte
byte register into EA byte
memory word into ES
word register into ES
Move CS into EA word
Move DS into EA word
Move immediate word into EA word
Seite 31
Computer Architektur
8C /0
89 /r
8C /2
B0+rb ib
8A /r
B8+rw iw
8B /r
MOV
MOV
MOV
MOV
MOV
MOV
MOV
ew,ES
ew,rw
ew,SS
rb,ib
rb,eb
rw,iw
rw,ew
8E
8E
A2
A3
A4
A5
A4
A5
/2
/2
iw
iw
MOV SS,mw
MOV SS,rw
MOV xb,AL
MOV xw,AX
MOVS mb,mb
MOVS mw,mw
MOVSB
MOVSW
F6
F7
F6
F7
/4
/4
/3
/3
Move
Move
Move
Move
Move
Move
Move
ES into EA word
word register into EA word
SS into EA word
immediate byte into byte register
EA byte into byte register
immediate word into word register
EA word into word register
Move
Move
Move
Move
Move
Move
Move
Move
memory word into SS
word register into SS
AL into byte variable (offset iw)
AX into word register (offset iw)
byte [SI] to ES:[DI], advance SI and DI
word [SI] to ES:[DI], advance SI and DI
byte DS:[SI] to ES:[DI], advance SI and DI
word DS:[SI] to ES:[DI], advance SI and DI
90
F6
F7
0F
0F
0F
0F
MUL eb
MUL ew
NEG eb
NEG ew
NIL (prefix)
NOP
/2
NOT eb
/2
NOT ew
16/0
#NOTBIT eb,CL
17/0
#NOTBIT ew,CL
1E/0 ib #NOTBIT eb,ib
1F/0 ib #NOTBIT ew,ib
Unsigned multiply (AX = AL * EA byte)
Unsigned multiply (DXAX = AX * EA word)
Two's complement negate EA byte
Two's complement negate EA word
Special "do-nothing" opcode assembles no code
No Operation
Reverse each bit of EA byte
Reverse each bit of EA word
Complement bit CL of eb
Complement bit CL of ew
Complement bit ib of eb
Complement bit ib of ew
0C
0D
80
08
83
81
09
0A
0B
ib
iw
/1 ib
/r
/1 ib
/1 iw
/r
/r
/r
Logical-OR
Logical-OR
Logical-OR
Logical-OR
Logical-OR
Logical-OR
Logical-OR
Logical-OR
Logical-OR
OR
OR
OR
OR
OR
OR
OR
OR
OR
AL,ib
AX,iw
eb,ib
eb,rb
ew,ib
ew,iw
ew,rw
rb,eb
rw,ew
E6 ib
E7 ib
EE
EF
6E
6F
6E
6F
OUT ib,AL
OUT ib,AX
OUT DX,AL
OUT DX,AX
*OUTS DX,eb
*OUTS DX,ew
*OUTSB
*OUTSW
Output
Output
Output
Output
Output
Output
Output
Output
1F
07
8F /0
58+rw
17
61
9D
POP DS
POP ES
POP mw
POP rw
POP SS
*POPA
POPF
Set
Set
Set
Set
Set
Pop
Set
0E
1E
06
6A ib
68 iw
FF /6
50+rw
16
60
9C
PUSH CS
PUSH DS
PUSH ES
*PUSH ib
*PUSH iw
PUSH mw
PUSH rw
PUSH SS
*PUSHA
PUSHF
Set [SP-2] to CS, then decrement SP by 2
Set [SP-2] to DS, then decrement SP by 2
Set [SP-2] to ES, then decrement SP by 2
Push sign-extended immediate byte
Set [SP-2] to immediate word, then decrement SP by 2
Set [SP-2] to memory word, then decrement SP by 2
Set [SP-2] to word register, then decrement SP by 2
Set [SP-2] to SS, then decrement SP by 2
Push AX,CX,DX,BX,original SP,BP,SI,DI
Set [SP-2] to flags register, then decrement SP by 2
D0
D2
C0
D1
D3
C1
/2
/2
/2 ib
/2
/2
/2 ib
RCL
RCL
*RCL
RCL
RCL
*RCL
eb,1
eb,CL
eb,ib
ew,1
ew,CL
ew,ib
Rotate
Rotate
Rotate
Rotate
Rotate
Rotate
9-bit quantity (CF, EA byte) left once
9-bit quantity (CF, EA byte) left CL times
9-bit quantity (CF, EA byte) left ib times
17-bit quantity (CF, EA word) left once
17-bit quantity (CF, EA word) left CL times
17-bit quantity (CF, EA word) left ib times
D0
D2
C0
D1
D3
C1
/3
/3
/3 ib
/3
/3
/3 ib
RCR
RCR
*RCR
RCR
RCR
*RCR
eb,1
eb,CL
eb,ib
ew,1
ew,CL
ew,ib
Rotate
Rotate
Rotate
Rotate
Rotate
Rotate
9-bit quantity (CF, EA byte) right once
9-bit quantity (CF, EA byte) right CL times
9-bit quantity (CF, EA byte) right ib times
17-bit quantity (CF, EA word) right once
17-bit quantity (CF, EA word) right CL times
17-bit quantity (CF, EA word) right ib times
F3
REP (prefix)
byte
word
byte
word
byte
word
byte
word
immediate byte into AL
immediate word into AX
immediate byte into EA byte
byte register into EA byte
immediate byte into EA word
immediate word into EA word
word register into EA word
EA byte into byte register
EA word into word register
AL to immediate port number ib
AX to immediate port number ib
AL to port number DX
AX to port number DX
[SI] to port number DX, advance SI
[SI] to port number DX, advance SI
DS:[SI] to port number DX, advance SI
DS:[SI] to port number DX, advance SI
DS to top of stack, increment SP by 2
ES to top of stack, increment SP by 2
memory word to top of stack, increment SP by 2
word register to top of stack, increment SP by 2
SS to top of stack, increment SP by 2
DI,SI,BP,SP,BX,DX,CX,AX (SP value is ignored)
flags register to top of stack, increment SP by 2
Repeat following MOVS,LODS,STOS,INS, or OUTS CX times
Seite 32
Computer Architektur
65
F3
64
F2
F2
F3
#REPC (prefix)
REPE (prefix)
#REPNC (prfix)
REPNE (prfix)
REPNZ (prfix)
REPZ (prefix)
CB
C3
CA iw
C2 iw
RETF
RET
RETF iw
RET iw
Repeat
Repeat
Repeat
Repeat
Repeat
Repeat
following
following
following
following
following
following
CMPS
CMPS
CMPS
CMPS
CMPS
CMPS
or
or
or
or
or
or
SCAS
SCAS
SCAS
SCAS
SCAS
SCAS
CX
CX
CX
CX
CX
CX
times
times
times
times
times
times
or
or
or
or
or
or
/0
/0
/0 ib
/0
/0
/0 ib
28/0
ROL eb,1
ROL eb,CL
*ROL eb,ib
ROL ew,1
ROL ew,CL
*ROL ew,ib
#ROL4 eb
Rotate
Rotate
Rotate
Rotate
Rotate
Rotate
Rotate
8-bit EA byte left once
8-bit EA byte left CL times
8-bit EA byte left ib times
16-bit EA word left once
16-bit EA word left CL times
16-bit EA word left ib times
nibbles: Heb=Leb
HAL,Leb=LAL
D0
D2
C0
D1
D3
C1
0F
/1
/1
/1 ib
/1
/1
/1 ib
2A/0
ROR eb,1
ROR eb,CL
*ROR eb,ib
ROR ew,1
ROR ew,CL
*ROR ew,ib
#ROR4 eb
Rotate
Rotate
Rotate
Rotate
Rotate
Rotate
Rotate
8-bit EA byte right once
8-bit EA byte right CL times
8-bit EA byte right ib times
16-bit EA word right once
16-bit EA word right CL times
16-bit EA word right ib times
nibbles: Leb=Heb
Heb=LAL AL=eb
9E
D0
D2
C0
D1
D3
C1
/4
/4
/4 ib
/4
/4
/4 ib
SAHF
SAL eb,1
SAL eb,CL
*SAL eb,ib
SAL ew,1
SAL ew,CL
*SAL ew,ib
Store AH
Multiply
Multiply
Multiply
Multiply
Multiply
Multiply
D0
D2
C0
D1
D3
C1
/7
/7
/7 ib
/7
/7
/7 ib
SAR
SAR
*SAR
SAR
SAR
*SAR
eb,1
eb,CL
eb,ib
ew,1
ew,CL
ew,ib
Signed
Signed
Signed
Signed
Signed
Signed
1C
1D
80
18
83
81
19
1A
1B
ib
iw
/3 ib
/r
/3 ib
/3 iw
/r
/r
/r
SBB
SBB
SBB
SBB
SBB
SBB
SBB
SBB
SBB
AL,ib
AX,iw
eb,ib
eb,rb
ew,ib
ew,iw
ew,rw
rb,eb
rw,ew
Subtract
Subtract
Subtract
Subtract
Subtract
Subtract
Subtract
Subtract
Subtract
SCAS mb
SCAS mw
SCASB
SCASW
0F
0F
0F
0F
0F
14/0
15/0
1C/0 ib
1D/0 ib
01 /0
#SETBIT
#SETBIT
#SETBIT
#SETBIT
*SGDT m
D0
D2
C0
D1
D3
C1
D0
D2
C0
D1
D3
C1
/4
/4
/4
/4
/4
/4
/5
/5
/5
/5
/5
/5
SHL
SHL
*SHL
SHL
SHL
*SHL
SHR
SHR
*SHR
SHR
SHR
*SHR
ib
ib
ib
ib
0F 01 /1
0F 00 /0
0F 01 /4
F9
FD
FB
eb,CL
ew,CL
eb,ib
ew,ib
eb,1
eb,CL
eb,ib
ew,1
ew,CL
ew,ib
eb,1
eb,CL
eb,ib
ew,1
ew,CL
ew,ib
*SIDT m
*SLDT ew
*SMSW ew
STC
STD
STI
CF=0
ZF=0
CF=1
ZF=1
ZF=1
ZF=0
Return to far caller (pop offset, then seg)
Return to near caller (pop offset only)
RET (far), pop offset, seg, iw bytes
RET (near), pop offset, iw bytes pushed before Call
D0
D2
C0
D1
D3
C1
0F
AE
AF
AE
AF
until
until
until
until
until
until
into flags
EA byte by
EA byte by
EA byte by
EA word by
EA word by
EA word by
divide
divide
divide
divide
divide
divide
Compare
Compare
Compare
Compare
with
with
with
with
with
with
with
with
with
bytes
words
bytes
words
EA
EA
EA
EA
EA
EA
SF ZF xx AF xx PF xx CF
2, once
2, CL times
2, ib times
2, once
2, CL times
2, ib times
byte
byte
byte
word
word
word
borrow
borrow
borrow
borrow
borrow
borrow
borrow
borrow
borrow
AL
AL
AX
AX
-
LAL=Heb
by
by
by
by
by
by
2,
2,
2,
2,
2,
2,
once
CL times
ib times
once
CL times
ib times
immediate byte from AL
immediate word from AX
immediate byte from EA byte
byte register from EA byte
immediate byte from EA word
immediate word from EA word
word register from EA word
EA byte from byte register
EA word from word register
ES:[DI],
ES:[DI],
ES:[DI],
ES:[DI],
advance
advance
advance
advance
DI
DI
DI
DI
Set bit CL of eb
Set bit CL of ew
Set bit ib of eb
Set bit ib of ew
Store 6-byte Global Descriptor Table register to M
Multiply
Multiply
Multiply
Multiply
Multiply
Multiply
Unsigned
Unsigned
Unsigned
Unsigned
Unsigned
Unsigned
EA byte by 2, once
EA byte by 2, CL times
EA byte by 2, ib times
EA word by 2, once
EA word by 2, CL times
EA word by 2, ib times
divide EA byte by 2, once
divide EA byte by 2, CL times
divide EA byte by 2, ib times
divide EA word by 2, once
divide EA word by 2, CL times
divide EA word by 2, ib times
Store 6-byte Interrupt Descriptor Table register to M
Store Local Descriptor Table register to EA word
Store Machine Status Word to EA word
Set carry flag
Set direction flag so SI and DI will decrement
Set interrupt enable flag, interrupts enabled
Seite 33
Computer Architektur
0F 31/r
#STOBITS rb,rb
0F 39/0 ib #STOBITS rb,ib
AA
STOS mb
AB
STOS mw
AA
STOSB
AB
STOSW
0F 00 /1
*STR ew
Store
Store
Store
Store
Store
Store
Store
2C
2D
80
28
83
81
29
2A
2B
0F
ib
iw
/5 ib
/r
/5 ib
/5 iw
/r
/r
/r
22
Subtract immediate byte from AL
Subtract immediate word from AX
Subtract immediate byte from EA byte
Subtract byte register from EA byte
Subtract immediate byte from EA word
Subtract immediate word from EA word
Subtract word register from EA word
Subtract EA byte from byte register
Subtract EA word from word register
Sub CL nibbles BCD at DS:SI from ES:DI (CL even,NZ)
A8
A9
F6
84
F7
85
84
85
ib
iw
/0 ib
/r
/0 iw
/r
/r
/r
0F
0F
0F
0F
9B
0F
0F
10/0
#TESTBIT
11/0
#TESTBIT
18/0 ib #TESTBIT
19/0 ib #TESTBIT
WAIT
00 /4
*VERR ew
00 /5
*VERW ew
9r
86
87
86
9r
87
SUB AL,ib
SUB AX,iw
SUB eb,ib
SUB eb,rb
SUB ew,ib
SUB ew,iw
SUB ew,rw
SUB rb,eb
SUB rw,ew
#SUB4S
TEST
TEST
TEST
TEST
TEST
TEST
TEST
TEST
AL,ib
AX,iw
eb,ib
eb,rb
ew,iw
ew,rw
rb,eb
rw,ew
eb,CL
ew,CL
eb,ib
ew,ib
immediate byte into AL for flags only
immediate word into AX for flags only
immediate byte into EA byte for flags only
byte register into EA byte for flags only
immediate word into EA word for flags only
word register into EA word for flags only
EA byte into byte register for flags only
EA word into word register for flags only
Test bit CL of eb, set Z flag
Test bit CL of ew, set Z flag
Test bit ib of eb, set Z flag
Test bit ib of ew, set Z flag
Wait until BUSY pin is inactive (HIGH)
Set ZF=1 if segment can be read, selector ew
Set ZF=1 if segment can be written to, selector ew
/r
XCHG
XCHG
XCHG
XCHG
XCHG
XCHG
D7
D7
34
35
80
30
83
81
31
32
33
ib
iw
/6 ib
/r
/6 ib
/6 iw
/r
/r
/r
XLAT mb
XLATB
XOR AL,ib
XOR AX,iw
XOR eb,ib
XOR eb,rb
XOR ew,ib
XOR ew,iw
XOR ew,rw
XOR rb,eb
XOR rw,ew
*
#
Starred forms will not execute on 8086/8088! See note at top of chart.
These instructions work only on NEC chips! See note at top of chart.
/r
/r
/r
AX,rw
eb,rb
ew,rw
rb,eb
rw,AX
rw,ew
AND
AND
AND
AND
AND
AND
AND
AND
AX to ES:DI,bit rb (incr. DI,rb), rb+1 bits
AX to ES:DI,bit rb (incr. DI,rb), ib+1 bits
AL to byte [DI], advance DI
AX to word [DI], advance DI
AL to byte ES:[DI], advance DI
AX to word ES:[DI], advance DI
Task Register to EA word
Exchange
Exchange
Exchange
Exchange
Exchange
Exchange
word register with AX
byte register with EA byte
word register with EA word
EA byte with byte register
with word register
EA word with word register
Set AL to memory byte [BX + unsigned AL]
Set AL to memory byte DS:[BX + unsigned AL]
Exclusive-OR immediate byte into AL
Exclusive-OR immediate word into AX
Exclusive-OR immediate byte into EA byte
Exclusive-OR byte register into EA byte
Exclusive-OR immediate byte into EA word
Exclusive-OR immediate word into EA word
Exclusive-OR word register into EA word
Exclusive-OR EA byte into byte register
Exclusive-OR EA word into word register
Seite 34
Computer Architektur
Aufgaben:
Ein Beispiel ist kein Beispiel. Also nachfolgend ein zweites, das Sie bitte ausprobieren wollen. Nachdem
es gelaufen ist, versuchen Sie bitte wieder, das Programm zu verstehen. Und dann versuchen Sie, ein
Programm zu schreiben, welches nicht das Datum, sondern die Zeit ausliest und darstellt. Hinweise dazu:
Funktion 02h des Interrupt 1ah holt die Zeit aus der PC Uhr und speichert die Stunden in ch, die Minuten
in cl und die Sekunden in dh.
;
;
;
;
;
;
datum.asm
**********************************************************************
Datum: Liest das Datum des PC und schreibt's auf den Schirm
Übersetzen mit NASM: nasm -f bin datum.asm -o datum.com
4.11.01 / Sö
**********************************************************************
org 100h
; Code beginnt bei 100h im Code Segment
section .text
; Codebereich:
start:
mov
ah,2ah
; Funktion Datum DOS Interrupt 21
int
21h
; Datum holen
mov
bx,cx ; Jahr nach bx zwischenspeichern
mov
al,dl ; Tag nach al
xor
ah,ah ; ah löschen
mov
ch,0ah
; 10 nach ch
div
ch
; al durch 10, q in al, rest in ah
add
al,48 ; dual -> ASCII
add
ah,48 ; dual -> ASCII
mov
[tag],al
; Tag speichern
mov
[tag+1],ah; "
mov
al,dh ; Monat nach al
xor
ah,ah ; analog zu Tag
div
ch
add
al,48
add
ah,48
mov
[monat],al
mov
[monat+1],ah
xor
dx,dx ; dx löschen
mov
ax,bx ; Jahr zurückholen nach ax
mov
cx,0ah
; 10 nach cx
div
cx
; ax durch 10, q in ax, rest in dx
add
dl,48 ; dual -> ASCII
mov
[jahr+3],dl; letzte Ziffer speichern
xor
dx,dx ; übrige Ziffen analog
div
cx
add
dl,48
mov
[jahr+2],dl
xor
dx,dx
div
cx
add
dl,48
mov
[jahr+1],dl
add
al,48
mov
[jahr],al
mov
mov
int
mov
int
dx,text1
; Adresse des Textes 1 nach dx
ah,09 ; Funktion des DOS Interrupt 21 nach ah
; (Textausgabe)
21h
; Text schreiben
ah,4ch
; zurück ins DOS
21h
section .data
; Datenbereich:
text1:
db
10,13,'Aktuelles Datum: '
tag: db
' .'
monat:
db
' .'
jahr: db
'
'
text2:
db
' $'
Seite 35
Computer Architektur
Interrupts
Ein Interrupt ist ein Vorgang im Prozessor, bei dem das gerade
laufende Programm nach Ausführung des gerade
durchgeführten Befehls unterbrochen wird. Der IP verändert
sich so, dass ein kleines Unterprogramm, die Interruptroutine,
ausgeführt wird. Nach Ausführung der Interruptroutine springt
der IP wieder zurück ins unterbrochene Programm und es wird wie wenn nichts geschehen wäre - der nächste Befehl
ausgeführt:
Ausgelöst wird ein Interrupt eigentlich durch die Hardware, entweder durch den Prozessor selber
(interner I., z.B. wenn der Prozessor durch null dividiert hat) oder durch die Peripherie (externer I., z.B.
wenn auf der Tastatur eine Taste gedrückt wurde). Daneben kann aber auch durch die Software ein
Interrupt ausgelöst werden. Das ist dann fast gleich, wie wenn das Programm ein Unterprogramm
aufrufen würde. Auch bei den Software - Interrupts gibt es verschiedene Auslöser:
Software – Interrupts haben Sie im vorigen Programm schon kennengelernt: Den Interrupt 21h zum
Beispiel: Er löst eine Aktion von DOS aus (von der Tastatur lesen, auf den Bildschirm schreiben, zurück
zum Befehlsinterpreter, etc.). Alle Interrupts, die es auf unserem PC gibt, sehen Sie in der folgenden
Tabelle.
Seite 36
Computer Architektur
Seite 37
Computer Architektur
Seite 38
Computer Architektur
In der Tabelle steht unter "Adresse" die RAM - Adresse auf die der IP nach Auftreten des Interrupts
wechselt. An dieser Stelle befindet sich aber noch nicht die Interruptroutine selber, sondern der Interrupt Vektor: Ein Sprungbefehl zur Routine!
Wenn man hier die Adresse ändert, kann man erreichen, dass eine Routine ausgeführt wird, die man
selber geschrieben hat - ein Hackereldorado natürlich! Man kann so nette Dinge machen, wie etwa, dass
Tasten und Zeichen auf dem Schirm nicht die selben sind.
Ein Tip: Bei Peripheriegeräten kann man oft einstellen, welchen Interrupt dieser verwendet (mit
Software oder mit einer Drahtbrücke (Jumper) oder mit einem Schalter). Da kann es dann vorkommen,
dass zwei Geräte den selben Interrupt verwenden - und dann läuft bei diesen meist gar nichts mehr. Dies
ist der häufigste Fehler, der auftritt, wenn Sie ein neues Gerät an Ihrem Computer anschliessen. Ändern
Sie also in diesem Fall bei einem Gerät die Interrupt - Nummer. Aber Achtung: meist muss dies auch der
Software mitgeteilt werden, welche das Gerät bedient.
Der Stack
Der Stack ist ein bestimmter Bereich im RAM, den man nicht wie sonst durch Angabe einer Adresse
erreicht, sondern über den Stack - Pointer (siehe Prozessorregister!): Dieser zeigt im RAM immer auf die
Information, die man zuletzt auf dem Stack deponiert hat. Stellen Sie sich einen Stapel Bücher vor. Sie
sehen immer nur das oberste Buch. Man kann nichts anderes machen, als ein weiteres Buch auf den
Stapel legen (das macht der Befehl push) oder das oberste Buch vom Stapel wegnehmen (das macht
der Befehl pull).
Der Stack wird vorallem für den Sprung in Unterprogramme verwendet: Beim Sprung in ein
Unterprogramm wird der Inhalt der Prozessorregister auf dem Stack deponiert. Will man aus dem
Unterprogramm zurück in aufrufende Programm springen, holt man sich die Registerinhalte wieder vom
Stack. Und das Schöne daran ist: Von einem Unterprogramm aus kann man wiederum in ein
Unterprogramm springen - Unterprogramme lassen sich also "verschachteln". Dank dem Stack Mechanismus klappt die Register - Buchhaltung automatisch! Der Rücksprung aus einem Unterprogramm
geschieht mit dem Befehl ret, aus einer Interrupt - Routine mit iret.
Seite 39
Computer Architektur
6. Microcontroller
Einleitung:
Microcontroller und Microprozessoren unterscheiden sich durch ihren Aufbau wenig. Eher ihre
Anwendung ist unterschiedlich:


Mikroprozessoren sind der Kern eines Computersystems (PC, Server, Mainframe, etc.).
Sie sind in einem System eingebaut, auf welchem Programme auch entwickelt werden können.
Beispiel: Pentium.
Microcontroller sind für die Steuerung von Geäten gedacht (CD Player, Handys, etc.).
Sie sind in einem System eingebaut, auf welchem kaum Programme entwickelt werden.
Beispiel: 8051 und kompatible.
Insbesondere die Entwicklung von Programmen ist also bei Microcontroller – Systemen etwas speziell:
Im allgemeinen werden die Programme auf einem Computer (z.B. PC) entwickelt, dann werden sie in
einem nichtflüchtigen Speicher abgespeichert (ROM, PROM, EPROM, EEPROM, ...). Dieses
Speicherbaustein wird dann in das Microcontroller – System eingebaut und der Controller kann das
Programm abarbeiten.
Die Programme werden traditionellerweise noch in Assembler geschrieben, oft auch in C und neuerdings
in Java (Java wurde eigentich ursprünglich dafür entwickelt!). Wir entwickeln in Assembler.
Bei der Programmentwicklung möchte man natürlich möglichst schnell wissen ob das Programm auch
funktioniert. Ein Simulator ist das einfachste Tool für solche Tests: Es handelt sich um ein Programm,
das auf dem PC läuft und das so tut als sei es der Microcontroller. Der Simulator versucht, so gut wie
möglich so zu tun wie der Controller. Insbesondere bei Fragen der Geschwindigkeit gibt es aber
Probleme. Besser ist ein Emulator. Hier handelt es sich um Hardware, welche eine Verbindung zwischen
dem PC und dem Microcontroller – System herstellt. Wir verwenden einen Emulator. Er wird mit einem
Kabel mit der seriellen Schnittstelle des PC verbunden und wird in den Sockel im Microcontrollersystem
eingesteckt, in welchem sich später der nichtflüchtige Speicher befindet. Der Emulator gaukelt dem
Controller ein EPROM vor, so dass dieser das Programm abarbeiten kann.
Unser System:
Microcontroller:
Emulator:
EPROM:
Entwicklungsumgebung:
Microcontroller – System:
EPROM Programmer:
8032, ein kompatibler zum Industriestandard 8051.
EPS 1001 von ELV.
2764, 8 kByte.
Programm WinEdit.
Eigenentwicklung A. Plüss, Gymnasium Neufeld, Bern.
Grundplatine + Peripherieboard, je zweimal
UP 2000 von ELV.
Unterlagen:
grauer Ordner: „WBZ: Microcontroller im Unterricht“ von Aegid Plüss.
grüner Ordner: „Microcontroller“ mit allen übrigen Papieren.
Seite 40
Computer Architektur
Test von Hardware und Software:









An Gerät 209 oder 210 durchführen, sonst zuerst Installation der Software (siehe nachfolgenden
Abschnitt).
Emulator an serieller Schnittstelle COM1 (oben) anschliessen.
Emulator auf den Sockel auf dem Board aufstecken (rotes Kabel richtung Kühlkörper, bündig auf
der Seite richtung Prozessor!).
Roten Klip beim Pin „RST“ anschliessen.
Board mit dem Netzgerät mit Strom versorgen (grüne Lampe leuchtet).
Winedit starten mit „Start“, „Programme“, „Fächer“, „Informatik“, „WinEdit“.
Quelldatei öffnen mit „File“, „Open“ (z.B. im Ordner „myprog“, „First“ Datei „Count123.asm“.
Übersetzen mit „Project“, „Compile“. Sollte beim Hinunterladen ein Fehler auftreten, nächsten Punkt
ausführen.
ELV Programm starten mir „Start“, „Programme“, „Fächer“, „Informatik“, „ELV“ und dort folgende
Einstellungen vornehmen: Mit „Öffnen“ die Hex Datei wählen, dann Eprom: 2764 / 8 kByte, Reset:
High Pegel, dann „Start“ klicken – das Programm wird hinuntergeladen und gestartet.
Installation der Software:










Ist auf den Geräten 208 und 209 bereits ausgeführt!
Den Ordner \\server\Fächer\Info\labtec nach c:\ kopieren.
Programm c:\labtec\elv\install ausführen und Zielverzeichnis c:\labtec\elv wählen.
Verknüpfung herstellen zu c:\labtec\winedit\winedit.exe.
Bei dieser Verknüpfung mit „Eigenschaften“ das „Ausführen in:“ auf c:\labtec\winedit einstellen.
Verknüpfung herstellen zu c:\labtec\elv\Eps1001w.exe.
Dateien Winedit.ini und _default.pif aus dem Ordner c:\labtec\win95 nach c:\windows kopieren.
Datei default.wpj aus dem Ordner c:\labtec\win95\ serial\com_1 nach c:\windows kopieren.
Winedit starten, Menü „File“, „Configure“ wählen und im Dialogfeld „Working Directory“ c:\labtec
eingeben.
Testen gemäss obigem Abschnitt
Weitere Hilfe:




Grauer Ordner, Blätter bis rote Seite: Zuerst Theorie, p. 7 Speicherstruktur, p. 8 Adressierungsarten,
p. 17 Befehlssatz, p. 31 Subroutinen.
Rote bis blaue Seite: Projekte, durchgeführt am Neufeld.
Ab blaue Seite: dov. Unterlagen vom WBZ Kurs.
Bei uns durchgeführte Projekte: LED und Stromschiene (mit farbigen Lampen). Siehe grünen Ordner.
Seite 41
Herunterladen