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