:: wikimiki.org ::
| Maschinencode |
MaschinencodeUnter Maschinensprache (auch Maschinencode) versteht man den Befehlssatz eines Mikroprozessors, gleichsam seine Muttersprache. Im Gegensatz zur maschinennahen Assemblersprache oder Hochsprachen handelt es sich um eine für den Menschen kaum lesbare Sprache, die allenfalls von Experten mit einem so genannten Maschinensprachemonitor bearbeitet werden kann. Will man die Menge aller Befehle eines Prozessors beschreiben, so wird der Begriff Befehlssatz bevorzugt. Von Maschinensprache spricht man eher dann, wenn man ein konkretes, in Maschinensprache vorliegendes Programm analysiert oder wenn man den Befehlssatz (etwa vergleichend) auf seine sprachlichen Eigenschaften hin analysiert.
Da sich der Befehlssatz von Rechner mit unterschiedlichen Prozessoren im allgemeinen unterscheidet, sind in Maschinensprache geschriebene Programme nur sehr schwer übertragbar. Jede Prozessorarchitektur hat eine eigene, unterschiedliche Maschinensprache. Die direkte Programmierung in einer Maschinensprache wird heute kaum noch verwendet. Einige Programmiersysteme für höhere Programmiersprachen gestatten es, Maschinenbefehle in den Quelltext zu integrieren. Die Anwendung beschränkt sich dann auf solche Fälle, in denen es aus Effektivitätsgründen unumgänglich ist, maschinennah zu programmieren, wie etwa bei Hardware-Treibern.
- Maschinensprachen bieten nur sehr einfache Befehle.
- Ein Programm kann nur auf genau dem Prozessor ablaufen, für dessen Maschinensprache es programmiert wurde. Diese Einschränkung ist weniger schwerwiegend als es zunächst scheint. 24-Bit-Code, der 1964 für ein IBM S/360 geschrieben wurde, läuft noch heute auf zSeries-Rechnern mit 64-Bit Architektur. 16-Bit-Code, der für den mittlerweile 25 Jahre alten 8086-Prozessor programmiert wurde oder 32-Bit-Code, der für 80386 programmiert wurde, ist auf heutigen Pentium-Rechnern lauffähig. Da die Intel-Mikroprozessor-Architektur einen sehr großen Marktanteil hat (auch andere Firmen wie AMD benutzen sie), und die IBM-Architektur den Mainframebereich dominiert, sind Maschinensprachprogramme, die für diese Prozessoren geschrieben worden sind, sehr langlebig.
- Anm. zu obigem Stichpunkt: die Möglichkeit des Ausführens von Maschinensprache auf einer späteren CPU-Generation wird als Abwärtskompatibilität bezeichnet. Hierfür ist nicht der Verbreitungsgrad einer Architektur, sondern der Entwurf nachfolgender CPU-Generationen ausschlaggebend.
Überblick über die typische Funktionalität einer Maschinensprache
Die Maschinensprache enthält die direkt vom Prozessor verstandenen Befehle. Damit ein Computer nummerische Probleme lösen kann, muss ihm der Lösungsweg in einer ihm verständlichen Art und Weise mitgeteilt werden. Das Programmiermodell eines Prozessors beschreibt die für die Programmierung relevanten Hardware-Details. Typischerweise hat ein Prozessor eine zumeist kleine Zahl interner Register, die zur kurzzeitigen Zwischenspeicherung von Rechenoperanden und Ergebnissen benutzt werden. Der Prozessor kann über den Adressbus und Datenbus seinen angeschlossenen Hauptspeicher, sowie Schnittstellen zu externen Geräten ansprechen. Manche Architekturen verfügen nicht über Register, die Datenverarbeitung läuft in diesen Fällen in einem Stapel-, einem Variablen-Kontext und dem Hauptspeicher ab.
Grundlegende Maschinen-Befehle lassen sich in folgende Kategorien unterteilen:
- Arithmetische Operationen: Führen Berechnungen durch
- Speicheroperationen: Übertragen Daten zwischen Prozessorregistern und Speicher
- Vergleichesoperationen: Vergleich von Werten
- Steueroperationen: Verzweigungen, die den Ablauf des Programms beeinflussen
In vielen modernen Prozessoren sind die Befehle der Maschinensprache, zumindest die komplexeren unter ihnen, intern durch Mikroprogramme realisiert. Das ist insbesondere bei der sogenannten CISC-Architektur der Fall.
Programmerstellung
Intern ist jeder Befehl der Maschinensprache durch ein oder mehrere Zahlenwerte codiert. Diese Zahlenwerte bestehen aus dem Opcode, der die Art des Befehls festlegt, eventuell gefolgt von einem oder mehreren Bytes an Daten zu diesem Befehl. Eine sinnvolle Folge von solchen Zahlencodes im Hauptspeicher bzw. als Datei gespeichert bildet demnach ein Programm. Es gibt nun verschiedene Arten, solche Programme zu erstellen:
- Direkte Eingabe der Binärcodes über eine Reihe von Schaltern (äußerst kryptisch und unpraktisch, seit den 1970er Jahren völlig außer Gebrauch gekommen)
- Über einen Hex-Editor den Zahlen-Code in Hexadezimalzahlen schreiben. (immer noch sehr kryptisch und unpraktisch)
- Mit einem Assembler: Assemblersprachen formulieren die Prozessorbefehle des Maschinencodes als Mnemonics in einer einfachen, relativ leicht lesbaren Syntax. Dieser Quelltext wird danach vom Assembler in den Maschinencode konvertiert.
- Ein Programm wird in einer relativ abstrakten Hochsprache geschrieben, danach von einem Compiler in Maschinencode übersetzt (kompiliert).
- Alternativ können Programme in einer Hochsprache auch -- entweder nach Kompilierung in einen Zwischencode oder direkt -- durch einen Interpreter abgearbeitet werden.
Ein Beispiel hierfür ist die Programmiersprache Java, dessen Zwischencode (auch Bytecode genannt) von einem Interpreter ausgeführt wird. Dies geschieht für den Benutzer transparent, wenn z.B. ein Applet im Internet Browser ausgeführt wird. Auch wenn es bis in die 1950er Jahre hinein noch keine Compiler gab, wurden Programme durchaus schon in Hochsprachen entworfen, mussten dann aber manuell in Assemblersprache übersetzt werden.
Verwandte Artikel
:Assembler (Die Artikel sollten aufeinander abgestimmt werden)
:Assemblersprache (Die Artikel sollten aufeinander abgestimmt werden)
: CISC
: RISC
Kategorie:Programmiersprache
ja:機械語
ko:기계어
simple:Machine code
BefehlssatzDer Befehlssatz bezeichnet in der Informatik die Menge der Maschinenbefehle eines Mikroprozessors. Der Umfang des Befehlssatzes variiert je nach Prozessortyp beträchtlich. Relativ große Befehlssätze findet man in CISC-Prozessoren, möglichst kleine Befehlssätze werden in RISC-Prozessoren angestrebt. Heutige Hochleistungsprozessoren sind in der Regel hybride CISC/RISC-Prozessoren. Wie der Befehlssatz in der Hardware implementiert ist (zum Beispiel durch Mikroprogramme), bleibt dem Programmierer verborgen. Liegt ein konkretes Programm in den Befehlen eines Befehlssatzes vor, so spricht man auch von einem Programm in Maschinensprache.
Eigenschaften von Befehlssätzen
Ein Befehlssatz heißt orthogonal, wenn jeder Befehl auch jede Adressierungsart des Prozessors verwenden kann. Unter der Adressierungsart eines Prozessors versteht man dabei die Art und Weise, wie ein Prozessor mittels Adressangaben, Offsets und Registerinhalten die effektive Adresse von Operanden berechnen kann.
Ein Befehlssatz wird als symmetrisch bezeichnet, wenn alle Datentypen und Adressierungsarten eines Befehls nicht nur für seine Quell-, sondern auch für seine Zieloperanden erlaubt sind. Die Datentypen eines Prozessors umfassen dabei alle Typen, die unmittelbar mittels Maschinenbefehlen (d.h. ohne eine softwaremäßige Emulation) bearbeitet werden können.
Befehlsformate
Die einzelnen Befehle eines Befehlssatzes haben das allgemeine Format
Welcher Befehl gemeint ist, wird jeweils durch den Opcode spezifiziert. Die Breite der in einem Befehlssatz verwendeten Worte (d.h. Opcode/Operanden-Kombinationen) variiert je nach Prozessortyp deutlich. Sie kann insbesondere länger als gewöhnliche Speicherworte, d.h. als die Datenbusbreite des Prozessors sein. In diesem Fall müssen die Befehle durch mehrere Speicherzugriffe aus dem Speicher in den Prozessor geladen werden.
Befehlssatz-Architekturen
Will man eine Familie von Prozessoren mit ähnlichem Befehlssatz zusammenfassen, so spricht man auch von einer Befehlssatz-Architektur (instruction set architecture). Verbreitete Befehlssatz-Architekturen sind:
- X86
- IA-32
- PowerPC
- SPARC
Siehe auch: AT-Befehlssatz
Weblinks
- [http://cetusm.com/resources/cpuinfo.htm Überblick über Befehlssätze und Rechnerarchitekturen] (englisch)
- http://www.embeddedexpert.com/processor/16_bit.html
Kategorie:Rechnerarchitektur
ja:命令セット
Mikroprozessor
Ein Mikroprozessor (griech. mikros für klein: Prozessor in sehr kleinem Maßstab) ist ein elektronisches Rechenwerk auf einem Chip, welches mit Befehlen in Maschinensprache gesteuert werden kann. Es besteht aus einem binärem Rechenwerk, Anschlüssen und Steuerschaltungen.
Während bis Ende der 1960er Jahre Prozessoren aus Einzelbauteilen und integrierten Schaltungen mit geringer Integrationsdichte hergestellt wurden, war es danach möglich, alle Einheiten des Prozessors auf einem Chip unterzubringen, auf dem jeder Schalter als elementarer Baustein im Durchmesser nur einige Mikrometer an Platz beansprucht - der Mikroprozessor war geboren. Der erste kommerziell erfolgreiche war der 1971 vorgestellte 4-Bit-Prozessor 4004 von Intel. Es gab schon Ende der 60er Jahre einen Microprozessor von Rockwell (PPS4 (Parallel Processing System 4bit)), der aber nur für US-Rüstungsprojekte bei Raketensteuerungen Verwendung fand. Zunächst waren dies noch recht einfache Schaltungen. Die Mikroelektronik brachte neben der Miniaturisierung und der enormen Kostenersparnis noch weitere Vorteile wie Geschwindigkeit, geringer Stromverbrauch, Zuverlässigkeit und später auch höhere Komplexität. Dies führte dazu, dass vergleichsweise billige Mikroprozessoren mit der Zeit die teuren Prozessoren der Minicomputer und teilweise sogar der Großrechner verdrängten. Gegen Ende des zwanzigsten Jahrhunderts hielt der Mikroprozessor Einzug in viele elektronische Geräte, vor allem als CPU von Personal-Computern (PCs). Auch als die Strukturgröße der Mikroprozessor-Chips auf einige hundert Nanometer (Nanoelektronik) weiter verkleinert wurde, blieb der Begriff Mikroprozessor bestehen.
Zur Realisierung eines kompletten Computers muss der Mikroprozessor noch um Speicher und Ein-/Ausgabe-Funktionen erweitert werden. Diese stehen in Form weiterer Chips zur Verfügung. Nur wenige Jahre nach der Einführung von Mikroprozessoren erschienen jedoch auch sog. Mikrocontroller, die diese Funktionen auf einem Chip vereinigten.
Steuerung durch Befehle
Alle Computerprogramme liegen als binäres Bitmuster im Speicher vor. Diese Bitmuster sind prozessorspezifisch: bestimmte Muster lösen bei unterschiedlichen Prozessoren unterschiedliche elementare Befehle aus. Derartige elementare Prozessorbefehle lassen sich prozessorspezifisch in Maschinensprache oder Assemblersprache programmieren, allerdings ist das Programm dann nicht portabel. Zur Umgehung dieses Problems benutzt man Hochsprachen, etwa C, C++, FORTRAN oder Pascal.
Ein spezielles Übersetzungsprogramm (Compiler) setzt dann das Hochsprachenprogramm in für den Prozessor geeignete Maschinensprache um.
Aufbau
Ein Mikroprozessor besteht aus Registern, einem Rechenwerk, einem Befehlsdecoder sowie einem Steuerwerk.
Das Rechenwerk ist für arithmetische und logische Funktionen zuständig, Befehlsdecoder und Steuerwerk sind für die Ausführung der Befehle und die Koordination der Funktionseinheiten zuständig. Die Register bilden eine Art kleiner „Spezialspeicher“ für Zwischenergebnisse (z. B. von Rechenoperationen), auf die besonders schnell zugegriffen werden kann.
Zur Erhöhung der Rechengeschwindigkeit können Prozessoren mit Caches oder besonderen (etwa einem Hardwaremultiplizierer) bzw. zusätzlichen (etwa einem Fließkommarechenwerk) Rechenwerken ausgestattet sein.
Zur effizienteren Bearbeitung von Befehlen werden Pipelines verwendet.
Alle komplexeren Mikroprozessoren sind interruptfähig, d.h. eine Unterbrechung des Programmablaufes wird durch ein externes Signal bewirkt. Einige (sehr einfach aufgebaute und damit sehr billige) Prozessoren haben keine Interruptfähigkeit, sondern müssen über Software abfragen, ob ein äußeres Ereignis vorliegt. Diese Mikroprozessoren kommen bei extrem preissensitiven Bereichen wie Spielzeug u.ä. zum Einsatz.
Befehlsbearbeitung
Die Befehlsbearbeitung moderner Mikroprozessoren folgt dem Von-Neumann-Zyklus. Die wichtigsten Phasen sind dabei das Laden des Befehls (FETCH), seine Dekodierung (DECODE) und seine Ausführung (EXECUTE). Gelegentlich unterscheidet man auch noch eine Rückschreibphase, in welcher die Rechenergebnisse in bestimmte Register geschrieben werden. Da moderne Mikroprozessoren parallele Techniken wie etwa Pipelining und Superskalarität einsetzen, werden unter Umständen mehrere Befehle gleichzeitig in dieser Weise bearbeitet.
Ungeordnete Befehlsausführung
Die meisten modernen Hochleistungsprozessoren sind in der Lage, Befehle in ungeordneter, d.h. nicht strikt in der vom Programm vorgegebenen Reihenfolge auszuführen. Die Motivation für eine Abweichung von der vorgegebenen Befehlsfolge besteht darin, dass aufgrund von Verzweigungsbefehlen der Programmlauf nicht immer sicher vorhergesehen werden kann. Möchte man Befehle bis zu einem gewissen Grad parallel ausführen, so ist es in diesen Fällen notwendig, sich für eine Verzweigung zu entscheiden und die jeweilige Befehlsfolge spekulativ auszuführen. Es ist dann möglich, dass der weitere Programmlauf dazu führt, dass eine andere Befehlsfolge ausgeführt werden muss, so dass die spekulativ ausgeführten Befehle wieder rückgängig gemacht werden müssen. In diesem Sinne spricht man von einer ungeordneten Befehlsausführung.
Superskalarität
Die Grafik zeigt die wesentlichen Komponenten und das Grundprinzip einer ungeordneten Befehlsausführung. Zunächst erkennt man eine Harvard-Architektur, d.h. eine Trennung von Daten- und Befehlsspeicher, die ein paralleles Laden von Befehlen und ihren Operanden ermöglicht. Es existieren mehrere Rechenwerke, die parallel arbeiten können. Befehle und Operanden werden nun aber nicht direkt in die Rechenwerke eingespeist, sondern zunächst in sogenannte Reservierungs-Stationen. Dabei kann es sich um Befehle handeln, die aufgrund einer Programmverzweigung möglicherweise gar nicht ausgeführt werden müssen. Sobald ein Rechenwerk frei ist, werden Befehl und Operanden aus der zugehörigen Reservierungs-Station geladen, der Befehl ausgeführt und das Ergebnis in einem sogenannten Umbenennungs-Register aufgefangen. Das Zurückhalten des Ergebnisses ist notwendig, da noch nicht klar ist, ob der ausgeführte Befehl überhaupt auszuführen war. Sobald klar ist, dass die Verzweigung korrekt vorhergesagt wurde, sorgt die Komplettierungseinheit dafür, dass die Umbenennungs-Register mit den Architektur-Registern synchronisiert werden. Die Architektur-Register sind die klassischen Prozessor-Register, von denen aus das Ergebnis (ggf. über einen Cache-Speicher) in den Hauptspeicher transportiert wird. Sollte sich herausstellen, dass die Befehle aufgrund einer falsch vorhergesagten Verzweigung nicht auszuführen waren, so werden die Umbenennungs-Register zurückgesetzt. Man spricht dann auch von Branch Recovery.
Adressierungsarten
Harvard-Architektur
In modernen Mikroprozessoren werden verschiedene Adressierungsarten für die verwendeten Operanden verwendet. Dabei handelt es sich um verschiedene Methoden zur Berechnung der effektiven logischen Speicheradressen. Die Berechnung der physikalischen Adressen anhand der logischen Adressen ist davon unabhängig und wird in der Regel von einer Memory Management Unit durchgeführt. Das folgende Bild gibt einen Überblick über die die wichtigsten Adressierungsarten.
Registeradressierung
Bei einer Registeradressierung steht der Operand bereits in einem Prozessorregister bereit und muss folglich nicht mehr aus dem Speicher geladen werden. Erfolgt die Registeradressierung implizit, so wird das Register über die Angabe des Opcodes mitadressiert (Beispiel: der Opcode bezieht sich implizit auf den Akkumulator). Bei expliziter Registeradressierung wird die Nummer des Registers im Registerfeld des Opcodes mitgegeben.
Einstufige Adressierung
Bei einstufigen Adressierungsarten kann die effektive Adresse durch eine einzige Adressberechnung ermittelt werden. Es muss also im Laufe der Adressberechnung nicht erneut auf den Speicher zugegriffen werden. Bei unmittelbarer Adressierung enthält der Befehl keine Adresse, sondern den Operanden selbst. Bei direkter Adressierung enthält der Befehl die logische Adresse selbst, es muss also keine Adressberechnung mehr ausgeführt werden. Bei Register-indirekter Adressierung ist die gesuchte logische Adresse bereits in einem Adressregister des Prozessors enthalten. Die Nummer dieses Adressregisters wird über den Opcode übergeben. Bei der indizierten Adressierung erfolgt die Adressberechnung mittels Addition: Der Inhalt eines Registers wird zu einer Basisadresse hinzugerechnet. Bei Programmzähler-relativer Adressierung wird die neue Adresse aus dem aktuellen Wert des Programmzählers und einem Offset ermittelt.
Zweistufige Adressierung
Bei zweistufigen Adressierungsarten sind mehrere Rechenschritte notwendig, um die effektive Adresse zu erhalten. Insbesondere ist im Laufe der Berechnung meist ein zusätzlicher Speicherzugriff notwendig. Als Beispiel sei hier die indirekte absolute Adressierung genannt. Dabei enthält der Befehl eine absolute Speicheradresse. Das Speicherwort, das unter dieser Adresse zu finden ist, enthält die gesuchte effektive Adresse. Es muss also zunächst mittels der absoluten Speicheradresse auf den Speicher zurückgegriffen werden, um die effektive Adresse zu ermitteln. Dies kennzeichnet alle zweistufigen Verfahren.
Beispiele
- Mikroprozessoren von Intel
- Liste von Nicht-Intel-Mikroprozessoren
Siehe auch
- Integrierter Schaltkreis
- Digital Signal Processor (DSP)
- Prozessor
- Mikrocontroller
- CISC / RISC
- Prozessorkühler
Kategorie:Digitaltechnik
Kategorie:Elektrische Bauelemente
ja:マイクロプロセッサ
th:ไมโครโพรเซสเซอร์
AssemblerspracheEine Assemblersprache ist eine spezielle Programmiersprache, die die Maschinensprache einer spezifischen Prozessorarchitektur in durch den Menschen lesbarer Form repräsentiert. Jede Computerarchitektur hat folglich ihre eigene Assemblersprache.
Ein Programm in Assemblersprache wird auch als Assemblercode bezeichnet. Es wird durch einen speziellen Compiler, einen so genannten Assembler, in direkt ausführbare Maschinensprache (auch Maschinencode) umgewandelt. Die umgekehrte Umsetzung von Maschinencode in menschenlesbaren Assemblercode wird Disassemblierung genannt. Dabei gehen allerdings einige wesentliche Informationen verloren, z. B. Bezeichner und Kommentare.
In Assemblersprache (umgangssprachlich oft nicht ganz korrekt ebenfalls als Assembler bezeichnet) programmierte Programme zeichnen sich dadurch aus, dass man die komplette Bandbreite des Computers ausnutzen und Hardwarechips direkt programmieren kann. Assemblerprogramme sind praktisch immer um ein Vielfaches kleiner und schneller als Programme, die mit einer Hochsprache entwickelt wurden, zum Beispiel RISC OS das mit 4Mbyte Größe einen ähnlichen Umfang bietet wie Windows XP, wobei sich der Abstand durch moderne optimierende Compiler aber etwas verringert hat,
Die hauptsächlichen Nachteile von Assemblerprogrammen sind höhere Fehleranfälligkeit, extrem großer Programmieraufwand bei umfangreichen Projekten, die Unmöglichkeit ohne weiteres auf einem Rechner mit anderem Hardwareaufbau abzulaufen, sowie die im allgemeinen leichtere Entschlüsselbarkeit des Codes durch Wettbewerber und Konkurrenten. Praktisch wird deshalb heute Assemblerprogrammierung fast nur noch für kleine, aber besonders geschwindigkeitsbedürftige Teile von größeren Programmen eingesetzt.
Was ist eine Assemblersprache
Programmbefehle in Maschinensprache sind einfache Bitmuster, die sich aus den Opcodes und den dazugehörigen Daten bilden. Da die Zahlenwerte der Opcodes schwieriger zu merken sind, verwendet eine Assemblersprache besser merkbare Kürzel, so genannte mnemonische Symbole (kurz Mnemonics, dieser Begriff wurde eingeführt von Ada Lovelace, der ersten Person überhaupt, welche Computerprogramme schrieb).
Beispiel:
Der folgende Befehl in der Maschinensprache von x86-Prozessoren
10110000 01100001
entspricht dem Assemblerbefehl
mov $0x61, %eal ; AT&T-Syntax (Zeichen nach einem „;“ gelten als Kommentare)
bzw.
mov al, 61h ; Intelschreibweise
und bedeutet, dass der hexadezimale Wert 61 (97 dezimal) ins Register 'al' geladen werden soll. (al: dabei steht das 'a' für das Register, und das 'l' für low, was praktisch dem ersten Teil des Registers entspricht) Der Zweite Teil des Registers wird mit einem 'h' ausgezeichnet, das 'h' steht für High (Beispiel: 'ah'). Soll das ganze Register (je nach Speicherbedarfs des Typen der gespeichert werden soll) angesprochen werden wird 'l' bzw. 'h' durch 'x' ersetzt: 'ax').
Mit Computerhilfe kann man das eine in das andere weitgehend eins zu eins übersetzen. Jedoch werden Adressumformungen vorgenommen, so dass man symbolische Adressen benutzen kann. Im Allgemeinen haben die Assembler neben den eigentlichen Codes auch Steueranweisungen, die die Programmierung bequemer machen, zum Beispiel zur Definition eines Basisregisters.
Häufig werden komplexere Assemblersprachen (Makroassembler) verwendet, um die Programmierarbeit zu erleichtern. Makros sind dabei Bruchstücke von Assemblercode, der vor dem eigentlichen Assemblieren automatisch an Stelle der Makroaufrufe eingefügt wird. Dabei können einfache Parameterersetzungen vorgenommen werden. Die Disassemblierung von derart generiertem Code ergibt allerdings den reinen Assemblercode ohne die beim Übersetzen expandierten Makros.
Verschiedene Assemblersprachen
Jede Computerarchitektur hat ihre eigene Maschinensprache und damit Assemblersprache. Vereinzelt existieren sogar mehrere verschiedene Assemblersprachen (und zugehörige Assembler) für die gleiche Prozessorarchitektur. Das Beispiel oben ist für den 80386. Die Sprachen unterscheiden sich in Anzahl und Typ der Operationen.
Jedoch haben alle Architekturen die folgenden grundlegenden Operationen:
- Daten lesen und schreiben innerhalb des Zentralspeichers sowie Datenaustausch mit Registern
- Einfache arithmetische Operationen (mit Gleitkommaprozessoren auch komplexe)
- Einfache logische Operationen
- Einfache Kontrolle des Programmflusses
Bestimmte Rechnerarchitekturen haben oft auch komplexere Befehle wie z. B.
- Einen großen Speicherblock im Hauptspeicher verschieben.
- Höhere Arithmetik wie Sinus-, Kosinus- und Wurzelberechnung (entweder über spezielle Zusatzprozessoren realisiert oder über Softwareroutinen)
- Eine einfache Operation (z. B. Addition) auf einen Vektor von Werten anwenden.
- Massive, direkte Parallelprogrammierbarkeit des Prozessors, etwa bei Signalprozessoren.
- Unterbrechungssteuerungen, die besonders für Prozessrechner benötigt werden.
- Aufrufe von Ein-/Ausgabegeräten
- Synchronisation mit anderen Prozessoren für SMP-Systeme
Der Nutzen von Assemblern
Assemblerprogramme sind schneller als die Produkte der Hochsprachencompiler. Allerdings setzt dies jahrelange Erfahrung des Programmierers voraus. Ein Einsteiger wird einen langsameren Code schreiben und eher von den Compilaten eines guten Compilers lernen können als diesen zu übertreffen. Der Nutzen von Assembler liegt vielmehr in dem Verstehen, wie ein System arbeitet und funktioniert um damit in Hochsprachen umständliche Konstrukte zu vermeiden. Auch heute noch wird an vielen Hochschulen Assembler - oftmals gegen die Überzeugung der Studenten - gelehrt. Es geht darum ein Gefühl für den Rechner und seine Arbeitsweise zu bekommen.
Ein Kern an Code muss immer in Maschinensprache programmiert werden. Dazu gehören Teile der Systemprogrammierung, z. B. Betriebssystemerstellung oder Betriebssystem-API-Programmierung, sowie auf einigen Plattformen die Treiber-Programmierung.
Dazu werden häufig Cross-Assembler eingesetzt, die Code für eine andere Rechnerarchitektur erzeugen als die, auf der sie selbst ablaufen. Auch Compiler sind nur Programme, die erst einmal in Maschinencode übersetzt werden müssen, bevor mit ihrer Hilfe Programme übersetzt werden können.
Es gibt aber Fälle, in denen diskrete Berechnungen einfacher und effizienter direkt in Assembler geschrieben werden. Die meisten Hochsprachencompiler übersetzen zuerst in Assemblercode oder können diesen optional ausgeben, sodass man, wenn man will, Details genauer betrachten und gewisse Stellen von Hand optimieren kann.
Bei vielen Anwendungen für Geräte, die von so genannten Mikrocontrollern gesteuert sind, ist oft Programmierung in Assembler notwendig, um die knappen Ressourcen dieser Mikrocontroller optimal auszunutzen. Dies gilt insbesondere, wenn wegen Massenproduktion möglichst günstige und damit minimale Mikrocontroller verwendet werden sollen.
Heute noch müssen kleine Assemblerroutinen Aufgaben - z.B. das Speichern von Registern in Schedulern - in Betriebssystemen übernehmen. Früher wurden sogar ganze Betriebssysteme in Assembler geschrieben. Heute wird jedoch C bevorzugt.
Bis ca. 1990 wurden die meisten Computerspiele in Assemblersprachen programmiert, da nur so auf Heimcomputern und den damaligen Spielkonsolen eine akzeptable Spielgeschwindigkeit und eine den kleinen Speicher dieser Systeme nicht sprengende Programmgröße zu erzielen war. Noch heute gehören Computerspiele zu den Programmen, bei denen am ehesten kleinere assemblersprachliche Programmteile zum Einsatz kommen um so z.B. die Prozessorerweiterungen wie SSE(Intel CPUS) zu nutzen.
Einige Programmiersprachen wie C erlauben es daher, direkt im eigentlichen Quellcode Assemblerbefehle zu benutzen.
Weblinks
- Wikibooks: Assembler-Programmierung
- [http://ivs.cs.uni-magdeburg.de/bs/lehre/sose99/bs1/seminare/assembler.shtml Crash-Kurs in Assembler]
- [http://www.lcs-chemie.de/assemb.htm Assembler-Programmierung unter Linux]
Kategorie:Programmiersprache
Kategorie:Assembler
ja:アセンブリ言語
ko:어셈블리어
th:ภาษาแอสเซมบลี
HochspracheHochsprache (f.) ist eine allgemeine Bezeichnung für
# eine Standardsprache,
# eine kodifizierte Literatursprache.
# eine mündlich tradierte, von der Alltagsprache verschiedene Dichtersprache.
# eine höhere Programmiersprache
In den ersten beiden Fällen handelt es sich um Schriftsprachen. Ein Beispiel für eine rein mündlich tradierte Hochsprache ist die altarabische Dichtersprache in vorislamischer Zeit.
Gegenteil: Umgangssprache, Substandard
Kategorie:Sprache
Formale SpracheFormale Sprachen sind ein eigenständiges Wissensgebiet in der Theoretischen Informatik. Im Gegensatz zur Mathematik liegen die Objekte in den formalen Sprachen immer in einer codierten Form vor. So sind die natürlichen Zahlen in der Mathematik ein rein gedankliches Gebilde; in der Theoretischen Informatik wird aus ihnen durch die Codierung in das Dezimalsystem eine formale Sprache.
Wenn wir die Wörter einer natürlichen Sprache als Alphabetszeichen ansehen, dann bilden die Sätze der natürlichen Sprache wiederum eine Formale Sprache über dem Alphabet der natürlich sprachlichen Wörter. Allerdings entzieht sich die natürliche Sprache einer vollständigen Definition, die schließlich festlegt, welche Sätze zu der natürlichen Sprache hinzugehören und welche nicht. (Latein und Esperanto mögen hier Ausnahmen bilden.) Grundsätzlich können Gesetze und Mechanismen der formalen Sprachen daher nur für Teilbereiche der natürlichen Sprachen angewandt werden. Siehe dazu Linguistik.
Definitionen
Eine formale Sprache ist eine Menge von Wörtern. Ein Wort einer formalen Sprache ist eine Folge von Zeichen aus einem (in der Regel endlichen) Alphabet . Das Hintereinanderschreiben von Zeichen oder Wörtern heißt Konkatenation. Wenn man diese anzeigen will wird meist gelegentlich auch benutzt. Stets ist es belanglos, in welcher Reihenfolge konkateniert wird. Lediglich die Position der Zeichen in der Folge ist von Bedeutung: Somit gilt:
-
Die Konkatenation führt somit zu der algebraischen Struktur eines freien Monoids über dem gegeben Alphabet.
Dabei bezeichnet man das leere Wort - also die leere Folge von Zeichen - meist durch .
Weiterhin wird mit Betragsstrichen in der Regel die Längenfunktion beschrieben:
Wenn ein Wort ist, dann ist mit die Länge bezeichnet, das ist die Anzahl der Folgenglieder in : und für alle Alphabetszeichen und |wa|=|w|+1 für alle Wörter und Alphabetszeichen .
Beispiele
Wir listen hier häufig verwendete formale Sprachen auf:
#Die Programmiersprache C ist eine Formale Sprache. Die Wörter von C sind die jeweiligen Programme. Das Alphabet von C sind die Schlüsselwörter und Zeichen, die in der Definition von C festgelegt sind.
#Die natürlichen Zahlen in unärer Darstellung:
#
#
#Die Palindrome: wobei das Wort bezeichnet, das von hinten nach vorne aufgeschrieben gleicht.
#Die Primzahlen in Dezimalcodierung: . Hierbei bezeichnet die Codierung der natürlichen Zahlen im Dezimalsystem und PRIM steht für die Menge der Primzahlen.
#Die Morse- oder Thue-Folge: . Wobei ein Homomorphismus ist, der folgendermaßen definiert ist: und , . Somit sind die ersten Elemente der Thue-Folge: 0, 01, 0110, 01101001, 0110100110010110, ...
Weitere Sprechweisen
Ein Wort einer formalen Sprache heißt häufig auch String oder Zeichenkette. Das leere Wort heißt in der Algebra auch neutrales Element.
Operationen auf formalen Sprachen
Die Konkatenation zweier Sprachen und ist
.
Also alle Wörter, die man bilden kann, indem ein Wort aus und ein Wort
aus aneinandergereiht werden.
Man kann durch induktiv die Potenz einer Sprache für
mit definieren, dabei wird und definiert (beachte: die Menge, die nur das leere Wort enthält, ist selbst nicht leer!)
Jetzt können wir die Menge aller endlichen Wörter über dem Alphabet hinschreiben:
, wobei und wir hier die Symbole aus mit den Wörtern der Länge 1 identifizieren.
Die Operation wird auch als endlicher (oder kleenescher) Abschluss bezeichnet, der Operator selbst als Kleene-Stern (siehe Kleenesche Hülle).
Die Menge dieser Wörter kann endlich oder unendlich sein. Man spricht dann auch von einer endlichen bzw. unendlichen Sprache.
Wichtige formale Sprachklassen
#Noam Chomsky hat eine Hierarchie von formalen Grammatiken aufgestellt, die verschiedene Typen von formalen Sprachen erzeugen. Diese ist heute unter dem Namen Chomsky-Hierarchie bekannt. Hier wird unterschieden zwischen Typ 0, Typ 1, Typ 2 und Typ 3: Rekursiv aufzählbare, kontextsensitive, kontextfreie bzw. reguläre Sprachen.
#Aristid Lindenmayer hat ein Regelsystem vorgeschlagen, in dem Ersetzungsschritte in jedem Schritt an jeder Stelle parallel durchgeführt werden. Diese Systeme heißen L-Systeme.
#Mit Semi-Thue-Systeme lassen sich Sprachen festlegen, die aus Startwörtern ableitgeleitet werden.
#Mit Church-Rosser-Systemen werden Sprachen erklärt, deren Wörter sich auf ein Terminalwort reduzieren lassen.
#Termersetzungssysteme erzeugen die Menge von Termen, die zu einem Ausgangsterm äqivalent sind.
#Verallgemeinerungen von formalen Sprachen erhalten wir mit Graphgrammatiken mit denen wir Graphsprachen erzeugen können.
#Hypergraphgrammatiken erzeugen Hypergraphen, eine Verallgemeinerung von Graphen.
Siehe auch
- Lindenmayer-Systeme
- Chomsky-Hierarchie
- Formale Grammatik
Anwendungen siehe in:
- Berechenbarkeitstheorie
- Komplexitätstheorie
- Kryptographie
- Kryptanalyse
- Compilerbau
- Programmiersprache
Literatur
- Egon Börger: Berechenbarkeit, Komplexität, Logik. Vieweg, Braunschweig Wiesbaden,
- Eine dritte Auflage erschien 1995.
- Englische Ausgabe: Computability, Complexity, Logic. Erschienen in der Reihe: Studies in logic and the foundations of mathematics. North Holland, Amsterdam 1985.
:: Eine Darstellung der Formalen Sprachen im Kontext der Berechenbarkeitstheorie, Logik und Komplexitätstheorie. Stellt hohe Anforderungen an den Leser, liefert dafür tiefe Einblicke.
- Michael A. Harrison: Introduction to Formal Language Theory. Erschienen in der Reihe: Series in Computer Science, Addison-Wesley, 1978.
:: Eine sehr ausführliche und viel gelobte Einführung.
- John E. Hopcroft and Jeffrey D. Ullman: Einführung in die Automatentheorie, Formale Sprachen und Komplexitätstheorie. Addison-Wesley, 1988.
- Englisches Original: Introduction to Automata Theory, Languages and Computation. Addison-Wesley, 1979.
- Eine überarbeitete dritte Auflage auf deutsch erschien 1994.
:: Das englische Original ist das in der Theoretischen Informatik am häufigsten zitierte Buch. Die Beweise sind in der deutschen Übersetzung gelegentlich falsch wiedergegeben. Dieses Buch ist in zahlreiche Sprachen übersetzt worden.
- Grzegorz Rozenberg und Arto Salomaa: The Mathematical Theory of L-Systems. Academic Press, New York, 1980.
:: Das ausführlichste Buch über L-Systeme.
- Grzegorz Rozenberg und Arto Salomaa (Herausgeber): Handbook of Formal Languages. Volume I-III, Springer, 1997, ISBN 3-540-61486-9.
:: Eine ausführliche Übersicht über die wichtigsten Gebiete der Formalen Sprachen dargestellt jeweils von aktiv in diesem Gebiet arbeitenden Wissenschaftlern.
- Arto Salomaa: Formale Sprachen. Springer, 1978.
- Englisches Original: Formal Languages. Academic Press, 1973.
- Ingo Wegener: Theoretische Informatik. Teubner Stuttgart, 1993. ISBN 3-519-02123-4.
:: In der Darstellung der Formalen Sprachen wird stets die Komplexität der formal-sprachlichen Konstruktionen mitbehandelt. Diese ist sonst nur in der Originalliteratur zu finden.
Kategorie:Automatentheorie
Kategorie:Compilerbau
Kategorie:Theoretische Informatik
ja:形式言語
ko:형식 언어
MaschinensprachemonitorDer Maschinensprachemonitor, oft kurz "Monitor" genannt, ist die einfachste Form eines Betriebssystems für einen Computer.
Funktional nur knapp oberhalb der Maschinenkonsole, erlaubt es der Monitor mindestens, Daten aus Speicherzellen zu lesen und darauf zu schreiben sowie ein Programm ab einer beliebigen Speicheradresse auszuführen. Die Dateneingabe und -darstellung erfolgt typischerweise in hexadezimal, kann aber durchaus auch im Binär- oder Oktalsystem erfolgen.
Bedient werden Maschinensprachemonitore rein textuell. Da der Maschinensprachemonitor aus der Anfangszeit der Computer stammt, wurde oft ein Fernschreiber für die Ein- und Ausgabe verwendet. In den 1970er Jahren wurden sowohl das Konzept des Monitors als auch die Verwendung des Fernschreibers für die ersten Mikrocomputer wieder aufgegriffen.
Kommandos in einem Maschinensprachemonitor sehen etwa so aus:
200: 4C 00 02
Dies würde bei einem 6502-basierten Computer (z. B. C64) einen Sprung zur Adresse $0200 an die Speicherstellen ab $0200 schreiben, eine Endlosschleife also.
Einfache Maschinensprachemonitore begnügen sich mit 200-300 Byte Speicher. Komfortablere Maschinensprachemonitore verfügen teilweise über die Möglichkeit, Programmcode aus dem Speicher in Assemblersprache auszugeben oder sogar einzelne Befehle in Assemblerschreibweise zu akzeptieren und diese dann als Maschinencode in den Speicher zu schreiben.
Prozessorarchitektur
Unterteilung nach Elektronischer Strategie
- Analoge Prozessorarchitektur
- Digitale Prozessorarchitektur
- Synchrone Prozessorarchitektur
- Asynchrone Prozessorarchitektur ([http://www.cs.man.ac.uk/apt/projects/])
Eigentliche Prozessorarchitekturen
- Von-Neumann-Architektur
- Harvard-Architektur
- Rekonfigurierbare Systeme
- DLX-Mikroprozessor
Unterteilung nach Standard oder Hersteller
- Befehlssatz-Architektur
- ARM-Architektur
- MIPS-Architektur
Unterteilung nach Adress- oder Daten-Bus-Breite
- 1-Bit-Architektur
- 4-Bit-Architektur
- 8-Bit-Architektur
- 16-Bit-Architektur
- 32-Bit-Architektur
- 64-Bit-Architektur
Übergeordnete Kategorien
- Rechnerarchitektur
- Softwarearchitektur
Kategorie:MikroprozessorKategorie:Rechnerarchitektur
EffektivitätEffektivität ist das Verhältnis von erreichtem Ziel zu definiertem Ziel. Das Kriterium für das Vorhandensein von Effektivität ist im Gegensatz zur Effizienz ausschließlich die Frage, ob das definierte Ziel erreicht wurde oder nicht. Ein Verhalten ist dann effektiv, wenn es ein vorgegebenes Ziel erreicht. Dies ist im Unterschied zur Effizienz unabhängig vom zur Zielerreichung nötigen Aufwand.
Effektiv Arbeiten bedeutet, unter Einsatz aller Mittel das Ziel erreichen, effizient Arbeiten hingegen bedeutet, mit den gegebenen Mitteln das maximal mögliche Ergebnis zu erzielen (vgl. Ökonomisches Prinzip).
Gesondert wir der Begriff in der Linguistik verwandt, siehe Effektivität in der Linguistik.
HochspracheHochsprache (f.) ist eine allgemeine Bezeichnung für
# eine Standardsprache,
# eine kodifizierte Literatursprache.
# eine mündlich tradierte, von der Alltagsprache verschiedene Dichtersprache.
# eine höhere Programmiersprache
In den ersten beiden Fällen handelt es sich um Schriftsprachen. Ein Beispiel für eine rein mündlich tradierte Hochsprache ist die altarabische Dichtersprache in vorislamischer Zeit.
Gegenteil: Umgangssprache, Substandard
Kategorie:Sprache
S/360System/360 oder kurz S/360 bezeichnet eine Großrechnerarchitektur der Firma IBM aus dem Jahre 1964.
Die wichtigsten Designkriterien waren:
- General Purpose. Vor der S/360 waren Computer entweder für kaufmännische oder für naturwissenschaftlich-technische Zwecke optimiert.
- 8-Bit Zeichengröße. Im Gegensatz zu zeitgenössischen Architekturen, welche mit 6-Bit Einheiten arbeiteten wurden Bytes zu 8 Bits verwendet.
- 32- oder 64-Bit Gleitkommaworte mit hexadezimaler Basis.
- Vorzeichen bei Ganzzahlwerten ist 1 Bit
- Dezimalzahlen (gepackte Speicherung) können variable Längen von 1 bis 31 Stellen haben. In einigen "Hochsprachen" wie zum Beispiel RPG (Programmiersprache) nur 15 Stellen. Jede Ziffer belegt dabei ein halbes Byte (4 Bit, Binär codierte Dezimalzahlen), das Vorzeichen belegt im letzten Byte die letzten 4 Bits: "C" (1100) und "F" (1111) waren die positiven Vorzeichen, "D" (1101) das negative Vorzeichen. Alle anderen Kombinationen waren ungültige Vorzeichen. Die Position des Kommas muß man aufgrund der Operanden beim Programmieren ermitteln.
- Variabel lange Zeichenketten haben ein Längenfeld und werden nicht mit einem Spezialzeichen abgeschlossen.
- EBCDIC statt ASCII Code wegen der einfacheren Umsetzung aus Lochkartencode.
- Verzicht auf einen Stack. Dies macht Linkage Konventionen erforderlich, da bei Unterprogrammaufrufen der Status gesichert werden muss.
- Grundsätzlich indizierte Adressierung unter Verwendung eines Basisregisters. Programme sind so grundsätzlich unabhängig von physischen Adressen.
- Binäre Adressierung
- Alle Register sind Universalregister, die sowohl als Akkumulatoren als auch zur Adressierung (Ausnahme Register 0) verwendet werden können. Ratsam ist allerdings als Basisregister (Adressierung) nur die Register ab Nr. 3 (bis max. 8) zu verwenden. Register 1 und 2 werden von bestimmten Befehlen (z.Bsp. TRT) zwangsweise verwendet. Die Register 12 bis 15 werden für den Aufruf von Unterprogrammen verwendet und einige benötigt man auch noch für andere Zwecke. Ein Register reicht gerade um einen Speicherbereich von 4096 Bytes (4k Bytes) zu adressieren. In den Maschinenbefehlen stehen für eine Speicheradresse nur 2 Bytes zur Verfügung, 4 Bits für die Registernummer und 12 Bits für das Displacement.
- Die Universalregister sind 32 Bit breit, zur Adressierung werden die rechten 24 Bit verwendet, was einen Adressraum von 16 Megabyte ermöglicht. Bei den Befehlen "BAL" und "BALR" (Branch and Link) wird die Rücksprungadresse in ein Register gespeichert, dabei wird in den linken 4 Bits des Registers der Condition-Code gerettet. Aufgrund dieser Besonderheiten war es bei den Nachfolgesystemen nicht so einfach möglich, den Adressraum über die 16 MB hinaus zu erweitern.
Die S/360 - Architektur wurde im Laufe der letzten vierzig Jahre kontinuierlich weiter entwickelt und gipfelt zur Zeit in der Architektur der zSeries.
Betriebssysteme
Mit dem System/360 erschienen drei Betriebssysteme, TOS/360 für Installationen ohne Festplatten, DOS/360 für kleinere und OS/360 für größere Installationen mit Disks. OS/360 ist der Vorläufer des aktuellen z/OS.
Eine Besonderheit stellte das System 360/20 dar. Es war ursprünglich als reine Lochkartenanlage konzipiert (Ablösung von Tabelliermaschinen) und hatte nur einen eingeschränkten Instruktionssatz (Maschinenbefehle).
Die Registerbreite betrug 16 bit bei 8 statt 16 Registern.
Namensbedeutung
Das System hatte den Anspruch allumfassend zu sein. Daher wählte man die Zahl 360 als Hinweis auf den maximalen Grad eines Winkels. Der Anspruch konnte allerdings nicht erfüllt werden, sodass im Nachhinein die Zahl anders definiert wurde: 3 wurde als IBM-Standard gewertet und 60 für ein in den 1960ern entwickeltes Produkt. Daher hießen die Nachfolger S/370 und S/390.
Weblinks
- [http://www.research.ibm.com/journal/rd/441/amdahl.pdf Gene Amdahl et al.: Architecture of the IBM System/360, 1964]
- [http://www.heise.de/newsticker/meldung/46350 Heise: Vor 40 Jahren: der perfekte Computer]
Kategorie:IBM
Kategorie:Computer
ja:システム/360
ZSeries
z/Series ist die aktuelle Großrechnerarchitektur der Firma IBM. Gegenüber der Vorgängerarchitektur S/390 zeichnet sich zSeries vor allem durch die 64-Bit-Adressierung aus. Ältere Programme, die noch mit 31-Bit- oder 24-Bit- Adressierung laufen, werden ebenfalls noch unterstützt.
Die Stärken dieser Plattform liegen in der Zuverlässigkeit der Hardware sowie in der Virtualisierung. Die Hardware ist komplett redundant ausgelegt, so dass Ausfälle extrem unwahrscheinlich sind. Die aktuellen Modelle sind in der Lage, mit maximal 30 LPARs verschiedene Betriebssysteme zu booten.
Derzeit gibt es 4 Typen, die z800, die z900 (Modelle sind seit ca. September 2000 auf dem Markt), die z890 und die z990 (ab Frühjahr 2004). Im September 2005 hat die Firma IBM das neueste Modell angekündigt, welches jedoch mit der Bezeichnung System z9 109 mit der bisherigen Namenstradition bricht.
Rechner der zSeries haben keine eigenen Festplatten, sondern sind über ESCON, FICON oder Fibre Channel mit Storage-Servern oder einem SAN verbunden.
Die Prozessoren der z/Series enthalten:
- 16 General Purpose Register
- 16 Gleitkomma-Register
- 16 Access-Register
- 16 Control-Register
- 1 Floating Point Control Register
- 1 Program-Status Word
Auf Rechnern der zSeries laufen die Betriebssysteme z/OS, z/VM, z/VSE und zLinux. Die Architektur zeichnet sich auch durch eine eigene Begriffswelt aus, so wird zum Beispiel der Bootprozess als IPL (Initial Program Load) bezeichnet.
Mit Hercules ist ein Emulator erhältlich, der es ermöglicht, ein zSeries-System unter Windows oder Linux zu emulieren. Da IBM weder z/OS noch z/VM für diesen Emulator lizenziert, könnte hier allenfalls die Installation eines Linux getestet werden. Es gibt jedoch noch eine "freie" Version von MVS (3.8, die letzte Version im 24-Bit-Modus vor MVS/XA), die als Source (!) im WEB verfügbar ist und auf Hercules legal installiert werden darf.
Der weltweit am meisten verbreitete Emulator für die S/390 Architektur ist FLEX-ES. Das Produkt ermöglicht den Betrieb vieler aktueller und auch bereits abgelösten S/390 Betriebssysteme auf einem Intel Rechner. Im Gegensatz zu Hercules lizenziert IBM viele S/390 Betriebssysteme für den Einsatz unter FLEX-ES.
Siehe auch
- iSeries
- pSeries
- xSeries
Weblinks
- [http://www.ibm.com/servers/eserver/zseries/ Web-Angebot zur Produktserie bei IBM] (englisch)
- [http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/DZ9ZR002/CCONTENTS zSeries Principles of Operation] (englisch)
- [http://www.cbttape.org/mvs38.htm] MVS 3.8 Freeware bei www.cbttape.org
Kategorie:IBM
ja:ZSeries
ProgrammiermodellAls Registersatz (engl. Register Set) bezeichnet man die Menge aller Register eines Mikroprozessors. Die Menge derjenigen Register, welche durch Programme direkt angesprochen werden können, bezeichnet man auch als das Programmiermodell eines Prozessors. Über die Register des Programmiermodells hinaus kann es weitere Register geben, die nur prozessorintern verwendet werden. Diese werden auch als Hilfsregister bezeichnet.
Man unterscheidet innerhalb eines Registersatzes drei Typen von Registern:
- Datenregister dienen der Zwischenspeicherung von Operanden und Rechenergebnissen.
- Adressregister werden zur Adressierung von Operanden und Befehlen verwendet.
- Spezialregister finden in unterschiedlichen speziellen Bereichen Anwendung.
Gründe für die geringe Anzahl von Registern in einem Mikroprozessor
Die Zahl der Register in einem Prozessor ist - verglichen mit der heutigen Größe des Hauptspeichers, selbst verglichen mit der Größe heute üblicher Cache-Speicher - ausgesprochen gering. Der Grund für diese geringe Anzahl hat im wesentlichen mit Adressierungsproblemen bei größeren Registeranzahlen zu tun. Erhöht man die Anzahl der Register, so benötigt man früher oder später einen Adressdecoder für den Zugriff auf einzelne Zellen. Damit aber verliert man bereits - verglichen mit dem Zugriff über direkte Steuerleitungen, der zudem parallel auf mehrere Register erfolgen kann - extrem viel Zeit. Darüber hinaus werden Registeradressen in sogenannten Opcodes verwendet. Die Breite von Opcodes ist notwendigerweise limitiert, so dass sich auch eine Begrenzung der codierbaren Registeradressen ergibt.
Siehe auch
- Befehlssatz
Kategorie:Technische Informatik Kategorie:Rechnerarchitektur
Register (Computer)Ein Register ist in der Digitaltechnik im Allgemeinen ein kleiner sehr schneller Datenspeicher. In Prozessoren eines Computers sind Register direkt eingebaut. Die Gesamtheit aller Register eines Prozessors bezeichnet man als Registersatz. Register werden dort zum Zwischenspeichern von Befehlen, Speicheradressen und Rechenoperanden benutzt. Sie stehen an der Spitze der Speicherhierarchie und sind daher die schnellste Möglichkeit, Daten zu manipulieren, da der Zugriff unabhängig vom Daten- oder Adressbus erfolgt.
Die Registersätze verschiedener Arten von Prozessoren unterscheiden sich in der Art, der Anzahl und der Größe der zur Verfügung stehenden Register.
Registertypen
Datenregister
Datenregister werden benutzt, um Operanden zu speichern. Prozessoren neuerer Generation besitzen oft Datenregister mit Akkumulatorfunktion.
In der Regel ist die Größe des Datenregisters zusammen mit der Breite des Datenbus mit ausschlaggebend für die Einordnung des Prozessors als 8-, 16-, 32- oder 64-Bit-Prozessor. Prozessoren mit 8 Bit Datenbus und 8 Bit Datenregistern werden als 8-Bit-Prozessoren bezeichnet, z.B. MOS Technologies 6502 oder Zilog Z80. Prozessoren mit unterschiedlicher Größe von Datenbus und Datenregistern werden häufig auch entsprechend bezeichnet, z.B. der Motorola 68000, der mit 16 Bit Datenbus und 32 Bit Datenregistern als 16-/32-Bit-Prozessor bezeichnet wird. Die derzeit (2005) neuesten Prozessoren sind meist 64-Bit-Prozessoren, z.B. Alpha AXP, AMD Opteron, oder Intel-Prozessoren mit EM64T sowie Itanium.
Bei 8-Bit-Prozessoren waren Adressbus und Adressregister meist 16 Bit groß. Bei den meisten heutigen Prozessoren sind die Addressregister genauso groß wie die Datenregister, der Adressbus meist gleich groß oder kleiner.
Meist sind die Datenregister nur mit der ALU verbunden, nicht jedoch mit der FPU. Das heißt, in den meisten Prozessoren können Datenregister nicht als Operanden für FPU-Operationen verwendet werden. In diesem Fall müssen Operanden für die FPU in speziell dafür vorgesehenen Registern, den Fließkommaregistern gespeichert werden.
Adressregister
Die Adressregister spielen eine wichtige Rolle in der Adressarithmetik. Adressregister werden für die Berechnung von Speicheradressen eines Operanden oder Befehls genutzt. Sie haben Verbindung mit dem internen Datenbus und dem Adressbus.
Bei indizierter Adressierung, z. B. beim Intel 8086, werden zwei Typen von Adressregistern unterschieden, die Indexregister und die Basisadressregister, auf welche bei den Spezialregistern eingegangen wird. Indexregister speichern den Offset zu einer Basisadresse, der oft vorzeichenbehaftet ist.
Für das Indexregister berechnet ein spezieller Addierer die Summe aus dem Indexregisterwert und einem Offset, der auf dem internen Datenbus anliegt. Die sich ergebende Summe wird auf dem Adressbus ausgegeben.
Bei linearer Adressierung, z. B. beim Motorola 68000, gibt es keine solche Unterscheidung bei den Adressregistern, auch wenn indirekte Adressierungsarten unter Umständen unterstützt werden.
Frei verwendbare Register
Moderne CPUs, z.B. PowerPC besitzen frei verwendbare Register (engl. GPR für General Purpose Register). Diese Register lassen sich beliebig je nach Bedarf als Datenregister oder als Adressregister einsetzen.
Spezialregister
Spezialregister sind nicht vom Anwender programmierbar. Sie speichern den Betriebszustand des Prozessors, außerdem erfüllen sie Hilfsfunktionen für den Prozessor.
Bei den meisten Architekturen sind folgende Spezialregistertypen anzutreffen:
- Befehlszählregister, auch Programmzähler oder Befehlszähler, (englisch Instruction Pointer (IP (16-Bit)) bzw. Extended Instruction Pointer (EIP (32-Bit)) oder program counter (PC)): der Befehlszählregister enthält je nach Systemarchitektur die Speicheradresse des derzeitigen oder des nächsten auszuführenden Befehls;
- Befehlsregister: speichert den aktuellen Befehl;
- Statusregister: geben bestimmte Zustände nach Ausführung eines Befehls an (bspw. Zero-Flag, Vorzeichen-Flag etc.);
- Basisregister, z.B. für die Basisvektortabelle.
Stackregister
Die Stackregister (englisch stack pointer (SP)) sind Adressregister zur Verwaltung von Stapelspeichern. Ein Stapelspeicher, auch Kellerspeicher oder nur Stack genannt, wird von einem Stackregister nach dem LIFO-Prinzip organisiert und kann mit Push- bzw. Pop-Operationen gefüllt bzw. geleert werden. Dabei zeigt das Stackregister immer auf die Speicheradresse am Ende des Stacks, je nach Architektur auf oder zumeist hinter das letzte Element. Auf den meisten Architekturen existiert ein System-Stack und ein Anwender-Stack. Das Betriebssystem nutzt den System-Stack zur Sicherung und Restauration des Prozessorstatus bei Prozessumschaltung. Der Anwender-Stack kann vom Programmierer frei genutzt werden.
Siehe auch
Special function register
Kategorie:Digitaltechnik Kategorie:Rechnerarchitektur
AdressbusEin Adressbus ist in der Computertechnologie - im Gegensatz zum Datenbus - ein Bus, der nur Speicheradressen überträgt.
Die Busbreite, also die Anzahl der Verbindungsleitungen, bestimmt dabei, wieviel Speicher direkt adressiert werden kann. Wenn ein Adressbus n Adressleitungen hat, können 2n Speicherstellen adressiert werden. Dieser Bus ist Unidirektional.
Siehe auch: Adressierung (Datenverarbeitung), Adressbereich (Elektronik), Arbeitsspeicher, Unidirektional, Bidirektional
Kategorie:Rechnerarchitektur
DatenbusDie Bezeichnung Bus ist ein im Bereich der Datenverarbeitung häufig verwendeter Begriff für eine Datenverbindung, an die mehr als zwei Teilnehmer angeschlossen sind. Ein Bus ist ein Leitungssystem mit zugehörigen Steuerungskomponenten, das zum Austausch von Daten und / oder Energie zwischen Hardware-Komponenten dient. Bussysteme finden Anwendung insbesondere innerhalb von Computern und zur Verbindung von Computern mit Peripheriegeräten, aber auch in der Ansteuerung von Maschinen (Feldbusse) sowie immer häufiger in Automobilen zur Verbindung der elektronischen Einzelsysteme eines Fahrzeugs.
Grundbegriffe
Die an einen Bus angeschlossenen Komponenten werden auch als Knoten oder Busteilnehmer bezeichnet. Knoten, die selbständig auf den Bus zugreifen dürfen, bezeichnet man als aktive Knoten oder Master, andernfalls heißen sie passive Knoten oder Slave. Ein Bus, der mehrere Master-Knoten erlaubt, heißt Multimaster-Bus. Bei Multimaster-Bussen muss der Buszugriff von einer speziellen Komponente gesteuert werden, die Bus Arbiter genannt wird. Derjenige Knoten, der einen Zugriff auf den Bus initiiert, heißt Initiator, das Ziel eines solchen (lesenden oder schreibenden) Zugriffes heißt Target. Je nach Verwendungsart unterscheidet man Systembusse, Speicherbusse, Peripheriebusse und Ein-/Ausgabebusse. Darüber hinaus lassen sich grundsätzlich parallele von seriellen Bussen unterscheiden.
Bus als Teil des Computers
In der Computerarchitektur ist ein Bus ein Untersystem, das Daten oder Energie zwischen Computerbestandteilen innerhalb eines Computers oder zwischen verschiedenen Computern überträgt. Anders als bei einem Anschluss, bei dem ein Gerät mit einem anderen über eine oder mehrere Leitungen verbunden ist, kann ein Bus mehrere Peripheriegeräte über den gleichen Satz von Leitungen miteinander verbinden.
Frühe Busse waren tatsächlich nur parallele Stromschienen mit mehreren Anschlüssen. Aus dieser Zeit (um 1900) stammen die Bezeichnungen omnibus bar und abgekürzt bus bar für solche Sammelschienen (power rail). Die Bezeichnung wurde für Daten-Sammelleitungen (Datenbusse) übernommen, die Informationen an die angeschlossenen Teilnehmer weitergeben. Manche Quellen leiten 'BUS' auch als Abkürzung von 'Binary Unit System' ab.
Moderne Computerbusse können sowohl parallel, als auch bit-seriell verwendet werden. Während bei der eigentlichen Netz-Topologie der klassischen Bus-Leitung alle Teilnehmer nebeneinander am Bus hängen, können duch geeignete Kontaktierungen Knoten in einer kettenförmigen Anordnung hintereinander geschaltet werden. Neben der Netzwerktoplogie auf der physikalischen Ebene (physical layer (engl.)) kann ein busähnliches Verhalten auch durch entsprechende Implementierungen nachgebildet werden (vgl. OSI-Modell mit höheren Übertragungsebenen).
Die meisten Computer haben interne und externe Busse. Ein interner Bus schließt alle internen Bestandteile eines Computers an die Hauptplatine an (und folglich die CPU und den internen Speicher). Ein solcher interner Bus wird auch als lokaler Bus bezeichnet, weil er dafür gedacht ist, mit im Computer selbst vorhandenen Geräten zu verbinden, und nicht mit solchen in anderen Computern oder mit externen. Ein externer Bus schließt demgemäß externe Peripherie an die Hauptplatine an.
Adressierungsverfahren
Busse unterscheiden sich in der Art, wie einzelne Knoten adressiert werden. Sowohl für parallele als auch für serielle Busse gibt es eine Reihe typischer Verfahren.
Adressierung in Parallelbussen
Ein einfaches Adressierungsschema sieht wie folgt aus: Lediglich eine einzige Komponente ist ein Busmaster (in der Regel ist dies der Prozessor), alle anderen sind passiv. Legt nun der Master eine Adresse auf dem Bus an, so wird diese von einem zentralen Adressdekoder dekodiert. Dieser ermittelt die adressierte Komponente und teilt dieser über eine Select-Leitung mit, dass sie die adressierte Komponente ist.
Eine Modifikation dieses Schemas ergibt sich, wenn kein zentraler Adressdekoder verwendet wird, sondern jede angeschlossene Komponente über einen eigenen Adressdekoder verfügt. Die einzelnen Adressdekoder entscheiden dann anhand der angelegten Adresse unabhängig voneinander, ob ihre Komponente die gemeinte ist oder nicht.
Ein anderes Prinzip arbeitet ganz ohne Adressleitung. Der Bus besteht ausschließlich aus Datenleitungen, welche direkt zu der jeweils ausgewählten Komponente laufen. An derartigen Bussen können folglich nur so viele Komponenten angeschlossen werden, wie es parallele Datenleitungen im Bus gibt. Ein prominentes Beispiel für dieses Adressierungsverfahren liefert der SCSI-Bus.
Die beschriebenen Verfahren können auch miteinander kombiniert werden. Darüber hinaus ist zu beachten, dass reale Bustopologien in der Regel weit komplexer sind als die hier angenommenen. So werden in einem Rechensystem in der Regel verschiedene Bustypen zu einer Bushierarchie miteinander verbunden, die sich in der Art der Adressierung unterscheiden und über Brücken miteinander gekoppelt sind. Derartige Brücken sind in der Lage die Adressierung von einem Busprotokoll in das andere zu übersetzen. Auch spezielle Adressierungs-Aspekte von Multimaster-Bussen wurden hier nicht berücksichtigt.
Adressierung in seriellen Bussen
Die auf seriellen Bussen übertragenen Daten lassen sich als Datenpakete betrachten, die in mehrere Felder unterteilt sind. Ein typisches Datenpaket weist neben der Sender-Adresse auch die Empfänger-Adresse des Pakets auf. Angeschlossene Komponenten betrachten das Empfängerfeld und entscheiden dann, ob sie das Paket verarbeiten oder verwerfen.
Auch serielle Busse können natürlich als direkte Datenleitungen von Komponente zu Komponente konzipiert sein. In diesem Fall sind die Sender- und Empfänger-Felder überflüssig.
Bus-Mastering
Bus-Mastering bedeutet, dass der Prozessor eines Computersystems zeitweilig die Kontrolle über den Bus an eine Adapterkarte, den sogenannten Busmaster, abgibt. Dieser Busmaster adressiert in der Folge selbständig Speicher und IO-Bereiche zum Zweck des Datentransfers. Der Busmaster operiert also als eine Art Bridge bzw. wie eine eigenständige CPU. Während also solch ein sekundärer Prozessor den peripheren Bus beherrscht, ist die CPU meist in der Lage andere Arbeiten im System auszuführen, sofern die dafür nötigen Ressourcen im Zugriff sind. Meist ist der Bus zum Speicher hin noch teilweise nutzbar, es herrscht also Time-Sharing. Dies macht sich insbesondere bei modernen Multitasking-Betriebssystemen durchaus positiv in der Reaktionsfähigkeit bemerkbar, wobei die Busmaster-Aktivität oftmals über ein Interrupt-Signal mit dem Betriebssystem verkoppelt ist. Die Adapterkarte hat dabei den Sinn bestimmte Aufgaben asynchron zu anderen Tasks zu bedienen.
Geschichtliche Entwicklung
Speicher und andere Geräte wurden an den Bus an den gleichen Adressen und Datenstiften angebracht, die die CPU selbst benutzt, und zwar durch parallelen Anschluss. Die Kommunikation wurde durch die CPU gesteuert, die die Daten von den Geräten gelesen und sie die Blöcke aus dem Speicher liest. Alles wurde dabei durch einen zentralen Zeitgeber getaktet, der die Arbeitsgeschwindigkeit der CPU steuerte. Angeschlossene Geräte zeigten der CPU, dass sie Daten senden oder empfangen wollen, indem sie auf anderen CPU-Stiften ein Signal sendeten, was gewöhnlich durch eine Form von Interrupt geschah. Zum Beispiel hat ein Laufwerkscontroller (siehe Controller) der CPU signalisiert, dass neue Daten bereit waren gelesen zu werden, worauf die CPU die Daten verschob, indem sie den Speicher an dem Anschluss las, der dem Laufwerk entsprach. Fast alle frühen Computer wurden auf diese Weise zusammengesetzt, beginnend mit dem S-100 Bus im Altair und bis hin zum IBM PC in den 1980ern.
Diese "erste Generation" von Bussystemen litt jedoch unter dem gravierenden Nachteil, dass alles auf dem Bus mit der gleichen Geschwindigkeit arbeitet und alle Geräte sich einen einzelnen Taktgeber teilen mussten. Die Arbeitsgeschwindigkeit der CPU zu erhöhen war nicht einfach, weil man die Geschwindigkeit aller angeschlossenen Geräte ebenfalls steigern musste. Dies führte zu der seltsamen Situation, dass sehr schnelle CPUs "runterbremsen" mussten, um mit anderen Geräten im Computer kommunizieren zu können. Ein anderes Problem war, dass die CPU für alle Operationen benötigt wurde, und so, wenn sie mit anderen Aufgaben beschäftigt war, der reale Datendurchsatz des Busses drastisch darunter zu leiden hatte. Ein anderes praktisches Problem war, dass diese frühen Bussysteme schwierig zusammenzustellen waren, da sie viele Jumper erforderten, um die verschiedenen Betriebsparameter einzustellen.
Bussysteme der "zweiten Generation" wie NuBus waren auf die Lösung einiger dieser Probleme gerichtet. Sie teilten den Computer gewöhnlich in zwei "Welten", die CPU und den Speicher auf der einen Seite und die anzuschließenden Geräte auf der anderen, mit einem Buscontroller dazwischen. Dies erlaubte es, die Geschwindigkeit der CPU zu erhöhen, ohne den Bus zu beeinflussen. Dadurch wurde auch viel von der Belastung für das Verschieben der Daten aus CPU heraus und in die Karten und den Controller verringert, weil Geräte über den Bus ohne Einschaltung der CPU miteinander sprechen konnten. Dieses führte zu viel besserer tatsächlicher Leistung in der Praxis, erforderte aber auch eine viel höhere Komplexität der im Computer installierten Geräte. Weiter gingen diese Bussysteme das Geschwindigkeitsproblem an, indem sie einfach einen größeren Datentransportweg wählten, und so von den 8-bit parallelen Bussen der ersten Generation zu 16 oder 32-bit in der zweiten übergingen. Eine weitere Verbesserung bestand darin, dass Softwareeinstellungen hinzugefügt wurden, die die Zahl der Jumper reduzierten oder diese ersetzten.
Gleichwohl hatten die neueren Systeme eine negative Eigenschaft, die sie mit ihren früheren Vettern teilten: alles, was am Bus hing (außer der CPU), musste mit der gleichen Geschwindigkeit arbeiten. Da die CPU jetzt isoliert war und man ihre Geschwindigkeit ohne Probleme erhöhen könnte, stieg die Arbeitsgeschwindigkeit der CPUs und des Speichers fortlaufend viel schneller an, als die der Bussysteme, mit denen sie zusammenarbeiteten. Das Resultat war, dass die Busgeschwindigkeiten jetzt sehr viel langsamer waren, als für ein modernes System nötig, und die Maschinen hungerten nach Daten, weil sie viel schneller arbeiteten, als Daten hin und her transportiert werden konnten. Ein besonders typisches Beispiel für dieses Problem war, dass Videokarten sogar den neueren Bussystemen wie PCI schnell davonliefen. So wich man für Grafikkarten vom Bus-Konzept ab und führte einen exklusiven, deutlich schnelleren Anschluß (Port) für die Grafikkarte ein, den Accelerated Graphics Port. Der nächste Schritt und Stand der Technik Ende 2005 in dieser Entwicklung ist PEG, PCI Express for Graphics mit 16 Lanes.
Während dieser Periode fing auch eine zunehmende Anzahl von externen Geräten an, ihre eigenen Bussysteme einzusetzen. Als die Laufwerke zuerst eingeführt wurden, hat man sie mit einer Einsteckkarte an den Bus angeschlossen. Das ist der Grund, warum Computer so viele mit dem Bus verbundene Steckplätze (Slots) haben. In den 1980er und 1990er wurden deswegen neue Systeme wie SCSI und ATA eingeführt, und so blieben die meisten Slots in den modernen Systemen leer. Heute gibt es in einem typischen PC an die fünf unterschiedlichen Bussysteme, um die verschiedenen Geräte zu betreiben.
Später ging man dazu über, das Konzept des lokalen Busses im Vergleich zum externen Bus zu bevorzugen. Ersteres bezieht sich auf Bussysteme, die entworfen wurden, um mit internen Geräten, wie Grafikkarten zu arbeiten, letzteres um externe Geräte wie Scanner anzuschließen. Diese Definition war immer ungenau: IDE ist der Verwendungsart nach ein externer Bus; er wird aber fast immer innerhalb des Computers zu finden sein.
Busse der "dritten Generation" sind jetzt im Kommen, einschließlich HyperTransport und InfiniBand. Sie haben gewöhnlich die Eigenschaft, dass sie mit sehr hohen Geschwindigkeiten laufen, die benötigt werden, um Speicher und Videokarten zu unterstützen, während auch niedrigere Geschwindigkeiten möglich sind, um die Kommunikation mit langsameren Geräten, wie Laufwerken zu unterstützen. Sie sind auch sehr flexibel, was ihre physikalischen Anschlüsse betrifft und lassen sich sowohl als interne Busse verwenden, als auch, um verschiedene Rechner miteinander zu verbinden.
Dieses kann zu komplizierten Problemen führen, wenn es darum geht, unterschiedliche Anfragen zu bedienen, was dazu führt, dass die Software im Vergleich zum eigentlichen Hardwaredesign in den Vordergrund rückt. Im Allgemeinen neigen die Busse der dritten Generation dazu, mehr wie ein Netzwerk als wie ein Bus (im traditionellen Verständnis) auszusehen, mit mehr Bedarf an Protokollinformationen als bei früheren Systemen, und der Möglichkeit, dass verschiedene Geräte den Bus gleichzeitig benutzen.
Bussysteme
Datenbus
Ein Datenbus überträgt Daten zwischen Computerbestandteilen innerhalb eines Computers oder zwischen verschiedenen Computern. Anders als bei einem Anschluss, bei dem ein Gerät mit einem anderen Gerät über eine oder mehrere Leitungen verbunden ist, kann ein Bus mehrere Peripheriegeräte über den gleichen Satz von Leitungen miteinander verbinden.
Die Bezeichnung als Datenbus wird in mehrfachem Zusammenhang verwendet:
- mit Betonung auf Daten: zur Abgrenzung gegenüber gemeinsamen Anschlüssen, wie der Stromversorgung
- mit Betonung auf Bus: zur Unterscheidung der Topologie, wie z.B. direkten Punkt-zu-Punkt-Verbindungen
- bei parallen Bussen: zur Unterscheidung von Adress- oder Steuerleitungen
Adressbus
Ein Adressbus ist in der Computertechnologie - im Gegensatz zum Datenbus - ein Bus, der nur Speicheradressen überträgt. Die Busbreite, also die Anzahl der Verbindungsleitungen, bestimmt dabei, wieviel Speicher direkt adressiert werden kann. Wenn ein Adressbus n Adressleitungen hat, können Speicherstellen adressiert werden.
Steuerbus
Der Steuerbus ist ein Teil des Bussystems, welcher für Verbindungen von wichtigen PC-Teilen mit dem Steuerwerk des Prozessors eingesetzt wird. Über den Steuerbus wird kontrolliert, ob Daten übertragen werden. Bei freier Leitung gibt der Steuerbus mit einem Steuersignal weitere Übertragungen frei.
Interner Bus
Der interne CPU-Bus (engl.: internal CPU bus) dient zur Kommunikation der internen Einheiten des Prozessors (zwischen Leitwerk, Rechenwerk und deren Registern), gegebenenfalls auch mit dem L1-Cache.
Beispiele für parallele, interne Busse
- Accelerated Graphics Port (AGP)
- Extended ISA (EISA)
- Industry Standard Architecture (ISA)
- MBus
- Micro Channel Architecture (MCA)
- Multibus II
- NuBus oder IEEE 1196
- Peripheral Component Interconnect (PCI)
- SBus oder IEEE 1496
- S-100
- VESA Local Bus (VLB oder VL-Bus)
- VMEbus
- XT-Bus-Architektur
- Zorro-Bus
- Universal Serial Bus (USB)
- FireWire oder IEEE 1394
Beispiele für serielle, interne Busse
- I2C
- HyperTransport
- PCI-Express
- SPI
Externer Bus
Der externe CPU-Bus (engl.: external CPU bus) verbindet Prozessor(en), (L2-)Cache, Arbeitsspeicher und Peripheriebus-Schnittstelle.
Beispiele für parallele, externe Busse
- Advanced Technology Attachment (ATA)
- IEC-625-Bus, IEEE-488 oder General Purpose Interface Bus (GPIB)
- High Performance Parallel Interface (HIPPI)
- Personal Computer Memory Card International Association (PCMCIA)
- Small Computer System Interface (SCSI)
Beispiele für serielle, externe Busse
- ACCESS.bus (A.b)
- Apple Desktop Bus (ADB)
- ByteFlight BMW 7er
- Bus-Topologie, Token Bus
- Controller Area Network (CAN)
- Europäischer Installationsbus (EIB)
- FlexRay
- Universal Serial Bus (USB)
- FireWire
- SATA (Serial ATA)
!
ja:バス (コンピュータ)
StackIn der Informatik bezeichnet ein Stapelspeicher oder Kellerspeicher (kurz Stapel oder Keller, häufig auch mit dem englischen Wort Stack bezeichnet) eine häufig eingesetzte Datenstruktur. Sie wird von den meisten Mikroprozessoren in der Hardware direkt unterstützt.
Funktionsprinzip
Ein Stapel kann eine beliebige Menge von Objekten aufnehmen und gibt diese entgegengesetzt zur Reihenfolge der Aufnahme wieder zurück. Dazu stellen Stapel die Operationen
- push (einkellern) zum Hinzufügen eines Objektes und
- pop (auskellern) zum Zurückholen und Entfernen eines Objektes
bereit. Als erweiterte Funktion wird meist peek für das Ansehen ohne Entfernen eines Objektes angeboten.
Dabei wird nach dem Last In - First Out-Prinzip (deutsch zuletzt hinein - zuerst heraus, kurz LIFO) gearbeitet, das heißt es wird von pop immer das Objekt aus dem Stapel zurückgegeben, welches als letztes mit push hineingelegt wurde.
In der theoretischen Informatik werden Kellerspeicher benutzt, um bestimmte Problemklassen theoretisch betrachten zu können (vgl. Kellerautomat). Sie unterscheidet deshalb genauer zwischen einem echten Kellerspeicher (kurz Keller), bei dem kein Element außer dem obersten gelesen werden kann, und einem Stapelspeicher, bei dem ohne Veränderung der Daten jedes Element betrachtet werden kann (vergleichbar einem Lesezugriff auf einen Array). Diese Unterscheidung spielt jedoch in der Praxis keine Rolle, beinahe jede Implementation ist ein Stapel, daher werden die Begriffe im Allgemeinen synonym verwendet.
Illustration
Skizze eines Stapels
Man kann sich einen Stapelspeicher wie einen Stapel von Umzugskisten vorstellen. Man kann immer eine neue Kiste oben auf den Stapel packen (push) oder eine Kiste von oben herunternehmen (pop). Die Befehle push und pop erlauben ausschließlich den Zugriff auf das oberste Element des Stapelspeichers. Ein Entfernen eines weiter unten liegenden Elementes im Stapelspeicher ist nicht möglich. Das Lesen und Schreiben auf weiter unten liegende Elemente ist nur durch direktes Lesen und Beschreiben der Speicheradresse dieses Elementes möglich.
Geschichte
Die Verwendung eines Stapelspeichers zur Übersetzung von Programmiersprachen wurde 1957 von Friedrich Ludwig Bauer und Klaus Samelson unter dem Namen "Kellerprinzip" patentiert (Deutsches Patentamt, Auslegeschrift 1094019, B441221X/42m. Verfahren zur automatischen Verarbeitung von kodierten Daten und Rechenmaschine zur Ausübung des Verfahrens. Anmeldetag: 30. März 1957. Bekanntmachung der Anmeldung und Ausgabe der Auslegeschrift: 1.Dezember 1960. Dr. Friedrich Ludwig Bauer und Dr. Klaus Samelson, München, sind als Erfinder genannt worden. Erteilt 12.8.1971, DE-PS 1094019).
Die lange ausgebliebene internationale Anerkennung und [http://wwwbib.informatik.tu-muenchen.de/Fak_Schriften/Fak_Schrift_97/nobelpreis.html Ehrung] ihrer Leistung erfolgte erst im Jahre 1988: Friedrich Ludwig Bauer erhielt (als einziger Überlebender) den legendären Computer Pioneer Award (IEEE) for Computer Stacks.
Anwendungen
Mikroprozessoren
In Mikroprozessoren gibt es dazu oft ein spezielles Register, den Stapelzeiger (stack pointer, SP). Dieses Register enthält eine Speicheradresse, die auf den gerade obersten Stapeleintrag zeigt. Wenn mit der Operation push ein weiteres Objekt auf dem Stapel abgelegt wird, dann erhöht sich der Wert des Stapelzeigers und zeigt so auf die nächste Adresse, in die der neue Stapeleintrag geschrieben wird. Bei pop wird der Eintrag der Adresse gelesen und anschließend der Stapelzeiger vermindert, so dass er auf den letzten Stapeleintrag zeigt. Dieses Register kann i.A. auch direkt gesetzt werden. In manchen Prozessoren wird der Stapelzeiger bei push vermindert und bei pop erhöht. Am Prinzip ändert dies aber nichts.
Der Stapel des Mikroprozessors wird oft von diesem selbst bei Aufruf und Rücksprung von Unterprogrammen zur Speicherung der Rücksprungadresse genutzt, ohne dass ein zusätzliches push oder pop zum Ablegen oder Holen dieser Rücksprungadresse nötig ist, da die entsprechenden Anweisungen das Register selbst richtig setzen. Compiler für moderne Programmiersprachen erweitern diesen Mechanismus oft, indem sie mit zusätzlichen push- und pop-Operationen vor dem Aufruf des Unterprogramms an dieses Parameter übergeben. Ähnlich können so auch Ergebnisse des Unterprogramms zurückgegeben werden. Da der Stapel im normalen Arbeitsspeicher des Computers liegt, kann er vom Mikroprozessor auch wie normaler Speicher benutzt werden. Lokale Variablen, z.B. von Unterprogrammen, werden daher ebenfalls auf dem Stapel gespeichert.
In Multitasking-Systemen gibt es für jedes Programm einen eigenen Stapel. Beim Umschalten zwischen Prozessen wird dieser durch direktes Setzen von SP initialisiert.
Rekursive Programmierung
In diesem Zusammenhang ist auch die Realisierung von rekursiven Prozeduraufrufen mittels Stacks interessant. Dabei geht im Prinzip folgendes vor sich:
# Für jede Prozedurinstanz müssen Rücksprungadresse, Parameter und lokale Variablen gemerkt werden.
# Dies tut man in sogenannten Aktivierungsrecords, die auf dem Stack abgelegt werden.
# Wenn die Prozedur beendet wird, so wird ihr Aktivierungsrecord wieder vom Stack entfernt.
Durch die oben beschriebene Stack-Unterstützung von Microprozessoren wird also zugleich eine effiziente Unterstützung für rekursive Programmierung bereitgestellt.
Ein anderer Anwendungsbereich im Zusammenhang mit Rekursion ergibt sich, wenn man eine rekursive Funktion in eine iterative Funktion umwandeln will. Auch hierbei kommt häufig ein Stack zum Einsatz.
Compiler
Zur Übersetzung des Quellcodes einer Formalen Sprache nutzen Compiler und Interpreter einen Parser, der bei der Textanalyse Syntax-Regeln auf einem Stapel ablegt und so vergleichend dem nachfolgenden Textelement eine angenommene Bedeutung (das oberste Stapelelement) zuordnen kann. Programmiersprachen, die auf eine virtuelle Maschine aufsetzen (z. B. Java, C#, P-Code-Pascal), optimieren den kompilierten Zwischencode für die Verwendung eines Stapels, um zur Laufzeit die Interpretation dieses Zwischencodes zu beschleunigen.
Verarbeitung von Klammerstrukturen mittels Stacks
Stacks eignen sich hervorragend zur Auswertung von Klammerausdrücken, wie sie etwa in der Mathematik geläufig sind. Die folgenden Schritte geben eine grobe Richtschnur an, wie solche Strukturen mit Hilfe zweier Stacks verarbeitet werden können:
#Für Operatoren und Operanden wird je ein Stack initialisiert.
#Der zu verarbeitende Klammerausdruck wird symbolweise eingelesen.
#Wird eine öffnende Klammer eingelesen, so ist diese zu ignorieren.
#Wird ein Operand oder Operator eingelesen, so ist dieser auf den jeweiligen Stack zu legen.
#Wird eine schließende Klammer eingelesen, so sind folgende Schritte auszuführen:
##Den Obersten Operator von Operatorstack nehmen.
##So viele Operanden wie nötig vom Operandenstack nehmen.
##Ergebnis auswerten und auf Operandenstack legen.
#Schließlich ist der Operatorstack leer und im Operandenstack liegt das Ergebnis.
Umgekehrte Polnische Notation
Zur Berechnung von Termen wird gelegentlich die Umgekehrte Polnische Notation (UPN) verwendet, die mit Hilfe der Operationen eine Klammersetzung und Punkt-vor-Strich-Regeln überflüssig macht. Die Operationen werden auch hier nicht explizit angegeben, sondern ergeben sich aus den Rechenvorschriften der UPN. Zahlwerte werden automatisch auf dem Stapel abgelegt, Operatoren (+, -, - , /) holen die oberen beiden Werte (bei unären Operatoren, zum Beispiel Vorzeichenwechel, natürlich nur einen) vom Stapel und legen anschließend das (Zwischen-)Ergebnis dort wieder ab. Da hier der Operator als letztes angegeben wird (die Werte müssen zur Durchführung der Operation bereits auf dem Stapel vorliegen), spricht man auch von einer Postfix-Notation.
Infix-Notation
Bei der maschinengestützten Auflösung von arithmetischen Ausdrücken in der so genannten Infix-Notation (der Operator steht zwischen den beteiligten Zahlwerten) werden zunächst vorrangige Teilterme in einem Stapel zwischengelagert und so faktisch der Infix-Term schrittweise in einen UPN-Term umgewandelt, bevor das Ergebnis durch Abarbeiten des Stapels errechnet wird. Die Umformung erfolgt auch hier wieder durch einen Parser.
Stapelorientierte Sprachen
Stapelorientierte Sprachen (z. B. Forth oder Postscript) wickeln fast alle Variablen-Operationen über einen Stapel ab und stellen neben den oben genannten Operatoren noch weitere zur Verfügung. Beispielsweise tauscht der Forth-Operator swap die obersten beiden Elemente des Stapels. Arithmetische Operationen werden in der UPN notiert und beeinflussen damit ebenfalls den Stapel.
Forth benutzt einen zweiten Stapel (Return-Stapel) zur Zwischenspeicherung der Rücksprungadressen von Unterprogrammen während der Ausführungsphase. Dieser Stapel wird auch während der Übersetzungsphase für die Adressen der Sprungziele für die Kontrollstrukturen verwendet. Die Übergabe und Rückgabe von Werten an Unterprogrammen geschieht über den ersten Stapel, der zweite nimmt die Rücksprungadresse auf.
Verwandte Themen
Ein entsprechender First In - First Out-Speicher nennt sich Warteschlange, wie beim Stapelspeicher kann es auch dort zum Pufferüberlauf kommen.
Kategorie:Datenstruktur
ja:スタック
MikroprogrammEin Mikroprogrammsteuerwerk ist der Teil mikroprogrammierter Prozessoren, der die Ausführung eines Befehls im Prozessor steuert. Das Steuerwerk enthält eine Menge von Mikroprogrammen, die jeweils aus einer Liste von Steuersignalen bestehen, die das Verhalten von Prozessorelementen - zum Beispiel der ALU und den Registern - regeln. Bei manchen Prozessoren können die Mikroprogramme auch nachträglich geändert werden. Man könnte die Mikroprogramme auch als Firmware der CPU bezeichnen.
Während CISC-Prozessoren gewöhnlich mikroprogrammiert sind, werden bei RISC-Prozessoren Befehle meist direkt durch die Hardware implementiert. Einige Prozessoren (zum Beispiel der Crusoe von Transmeta) können ihre Mikroprogrammierung auch selbst dynamisch ändern, zum Beispiel um einen anderen Befehlssatz zu erlauben oder die Ausführung zu optimieren.
Kategorie:Rechnerarchitektur
ja:マイクロプログラム方式
OpcodeEin Opcode, auch op code oder operation code, ist eine Zahl, die die Nummer eines Maschinenbefehls für einen bestimmten Prozessortyp angibt. Alle Opcodes zusammen bilden den Befehlssatz des Prozessors oder der Prozessorfamilie. Jeder Befehl hat einen eigenen Opcode, etwa die Addition, Multiplikation, das Kopieren von Registern, Laden und Speichern von Registern aus dem Arbeitsspeicher, Ein- und Ausgabe usw. Einfache Opcodes stellen bereits einen Maschinenbefehl dar. Auf einen Teil der Opcodes müssen Adressen, Konstanten oder Ähnliches folgen, die dann zusammen mit dem Opcode einen Maschinenbefehl bilden.
Jedem Opcode wird ein kurzes Wort oder eine Abkürzung, ein so genanntes Mnemonic, zugeordnet. Mit den Mnemonics ergeben sich die Assemblersprachen, bei denen jeweils ein Mnemonic, gegebenenfalls gefolgt von Adressen oder Konstanten, in eine Zeile einer Textdatei geschrieben wird. Ein spezielles Programm, der Assembler, erzeugt Maschinencode, indem es im Wesentlichen die Mnemonics durch ihre jeweiligen Opcodes ersetzt.
Die meisten modernen Prozessoren besitzen einige hundert Opcodes.
Ältere Prozessoren hatten oft "undefinierte Opcodes". Bestimmte, für die Programmierung gar nicht vorgesehene Opcodes konnten durch ihre Nebenwirkungen auf den internen Schaltungsaufbau des Prozessors allerhand seltsame, schädliche oder seltener auch nützliche Effekte haben. Solche Opcodes wurden manchmal bei der Programmierung von Computerspielen auf Heimcomputern und frühen Spielkonsolen benutzt, um bestimmte Vorgänge ein wenig schneller ablaufen zu lassen oder um die Funktionsweise eines Kopierschutzes zu verschleiern . Nachteilig war, dass solche "undefinierten Opcodes" vom Hersteller nicht garantiert wurden und auf Nachfolgemodellen eines Prozessors oft nicht mehr funktionierten. Heutige Prozessoren tun dagegen entweder überhaupt nichts, wenn sie in einem Programm einen unbekannten Opcode antreffen, oder aber sie begeben sich in einen klar definierten Fehlerzustand.
Der 8-Bit-Prozessor Z80
Für den Z80-Prozessor kann man das folgende Assemblerprogrammfragment in eine Textdatei schreiben:
DEC A
INC B
SUB B
Ein Z80-Assembler erzeugt daraus das Maschinenprogramm:
5,4,144
wobei jeder Opcode beim Z80 ein Byte belegt. Häufig werden Maschinenprogramme hexadezimal dargestellt. Bei 8-Bit Rechnern kann jedes Byte durch zwei Hexadezimalziffern dargestellt werden, hier also:
05 04 90
Der Relaisrechner Zuse Z3
Die Z3 von Konrad Zuse aus dem Jahre 1941 hatte zwei Register R1 und R2, 64 Speicherzellen und beherrschte die Ein-/Ausgabe, die Grundrechenarten, Wurzelberechnung von Gleitkommazahlen. Programme wurden auf Lochstreifen abgelegt, die Opcodes der neun Befehle bestanden aus den folgenden Lochstreifencodierungen:
Der Lochstreifen ist 8 Bits breit. Die Opcodes für die Speicherzugriffe belegen nur 2 Bits, gefolgt von der Adresse der Speicherzelle. Die anderen Opcodes belegen 5 Bits, 3 Bits sind unbenutzt.
Kategorie:Assembler
Kategorie:Rechnerarchitektur
Hex-EditorUnter einem Hex-Editor versteht man ein Programm, das in der Lage ist, den Inhalt einer beliebigen Datei in Hexadezimal-Code darzustellen.
Beispiel einer geöffneten Datei im Hex-Editor:
00000 48 61 6C 6C 6F 2C 20 64 69 65 73 20 69 73 74 20 Hallo, dies ist
00010 65 69 6E 20 42 65 69 73 70 69 65 6C 2D 54 65 78 ein Beispiel-Tex
00020 74 2E t.
Hex-Editoren sind folgendermaßen aufgebaut:
- Ganz links wird ein Offset angezeigt. Dies gibt die Anzahl der vorausgegangenen Bytes in Hexadezimalschreibweise an. (Im Beispiel: In der ersten Zeile ist das Offset 0, also der Dateianfang. In der zweiten Zeile ist es 1016, also sind schon 1016 = 1610 Bytes vorangegangen.)
- Rechts daneben stehen die Bytes der Datei, jeweils hexadezimal dargestellt.
- Ganz rechts schließlich stehen die Bytes der aktuellen Zeile nochmal, und zwar im aktuellen Zeichensatz dargestellt. Dazu muss man wissen, dass für den Computer jedes Zeichen einen Code hat, der im Bereich von 0-255 liegt. Siehe dazu: ASCII, ANSI.
Hex-Editoren sind ursprünglich dazu geschrieben worden, den Inhalt binärer Dateien anzuzeigen und zu bearbeiten, die nicht mit Texteditoren dargestellt werden können.
Editoren
- [http://www.bpsoft.com/downloads/index.html Hex Workshop]
- http://www.winhex.de (Deutschsprachige Shareware)
- [http://www.kibria.de/frhed.html frhed: FRee HEx eDitor] (Englischsprachig, Open-Source Freeware)
- [http://www.mirkes.de/de/freeware/tinyhex.php Tiny Hexer] (Deutschsprachige Freeware)
- UltraEdit
Kategorie:Anwendungsprogramm
Assembler (Informatik)Ein Assembler der Informatik ist ein spezielles Übersetzungsprogramm, das ein in einer maschinennahen Assemblersprache geschriebenes Programm in Maschinensprache übersetzt. Oft wird der Ausdruck Assembler auch als Abkürzung oder Synonym für Assemblersprache verwendet.
Zu beachten ist, dass verschiedene Prozessorarchitekturen grundverschiedene Assembler- und Maschinensprachen haben, so dass jeweils ein zur aktuellen Architektur passender Assembler benötigt wird. Es gibt jedoch Assemblerfamilien, die mehrere Prozessoren unterstützen bei gleichbleibender Makrosprache und Arbeitsumgebung; der GNU Assembler ist z. B. eine solche Familie.
Die einfachste Version eines Assemblers, kombiniert mit der Möglichkeit, Programme interaktiv zu testen und zu analysieren, wird Maschinensprachemonitor genannt. Makroassembler gestatten die Bildung von parametrisierbaren Befehlsgruppen. Eine Makroanweisung wird im allgemeinen in mehr als einen Maschinenbefehl umgesetzt.
Der Anteil der Assemblerprogrammierung ist im Sinken. Der Möglichkeit der Erstellung effektiver Programme steht die erschwerte Wartbarkeit von Assemblerprogrammen gegenüber. Maschinennahe Programmierung – die Domäne von Assembler – kann heute überwiegend durch höhere Programmiersprachen abgedeckt werden. Einige Programmiersysteme für höhere Programmiersprachen gestatten es, Assemblerbefehle in den Quelltext mittels Inline-Assembler zu integrieren. Die Anwendung kann sich dann auf die Situationen beschränken, in denen es aus funktionalen oder Effizienzgründen notwendig oder nützlich ist, maschinennah zu programmieren.
Siehe auch: Cross-Assembler
Im Unterschied zu Compilern, die eine Hochsprache wie z.B. C oder Pascal in Maschinensprache übersetzen, sind Assembler immer spezifisch auf einen oder wenige Prozessortypen ausgerichtet.
Beim Assembler werden die Opcodes der jeweiligen CPU mit Namen, den sogenannten Mnemonics angegeben, während Hochsprachen primär die Umsetzung in Opcodes über mehre automatisierte Abstraktionsebenen hinweg bewerkstelligen. Dadurch werden Eigenschaften wie etwa eine begrenzte Registerbreite vor dem Programmierer versteckt. In Assembler sind nur Operationen im Rahmen der möglichen Register- und Operationsgrößen der CPU möglich. Oftmals sind Pragma-, Preprozessor- und Makrofähigkeiten in Assemblern möglich, die sich aber nur bedingt mit den Möglichkeiten von Hochsprachen vergleichen lassen.
Assembler sind häufig extrem einfach aufgebaut und daher meist auch sehr schnell.
Compiler hingegen übersetzen oft zunächst das Programm in eine Zwischensprache, die dann an einen Assembler weitergeleitet und in das letztlich benötigte Maschinenprogramm umgewandelt wird. Bei modernen Compilern erfolgt dieser Schritt implizit.
Ein Programm zum Rückübersetzen von Maschinensprache in Assemblersprache ist ein Disassembler. Diese Rückübersetzung ist möglich, da es – anders als bei Hochsprachen – eine Eins-zu-Eins-Beziehung zwischen einfacher Assemblersprache und Maschinensprache gibt. Dabei können jedoch Bezeichner und Kommentare nicht wiederhergestellt werden, da diese während der Assemblierung verloren gehen.
Meist werden aber etwas komplexere Assemblersprachen mit Makrofähigkeiten verwendet, so dass diese einfache Abbildung nicht mehr hundertprozentig zutrifft.
Die Tätigkeit des Disassemblierens ist bei urheberrechtlich geschützten Programmen durch Copyright-Bestimmungen reglementiert bis verboten, da das Disassemblieren die Möglichkeit eröffnet, den Code einfach zu ändern und danach wieder in ein Programm zu assemblieren. So könnte von erfahreneren Assembler-Programmieren und Hackern z.B. eine Passwortabfrage entfernt, eine etwa aus lizenzrechtlichen Gründen abgeschaltete Funktion aktiviert, oder ein Virus in das Programm eingeschleust werden.
Hersteller und Produkte
Für die x86-Prozessoren-Familie und kompatible Prozessoren (z. B. Intels Pentium oder AMDs Athlon) sind der Microsoft Macro Assembler (MASM), Borland Turbo Assembler (TASM) und der Netwide Assembler (NASM) weit verbreitet. Auch der Flat Assembler (FASM) bietet viele Features, die ein moderner Assembler benötigt. Neben Assemblern, die die Intel-Syntax kennen, gibt es noch solche, die Assemblercode in der AT&T-Syntax assemblieren können, wie den unter Linux hauptsächlich genutzten GNU Assembler (gas).
Auf IBM-Großrechnern (zSeries) wird der High Level Assembler verwendet, Hercules-Anwender müssen entweder den veralteten Assembler Assembler-F benutzen oder aber den Tachyon Legacy Assembler verwenden, welcher unter Linux für z/Series läuft.
Für die Mikrocontrollerfamilie [http://developer.intel.com/de | | |