• Keine Ergebnisse gefunden

Rechnertechnologien

N/A
N/A
Protected

Academic year: 2022

Aktie "Rechnertechnologien"

Copied!
16
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Rechnertechnologien – Zusammenfassung

Malte L. Jakob

10. Dezember 2019

(2)

Inhaltsverzeichnis

1 Entwicklung der Computer 3

1.1 Relais-basierte Computer . . . 3

1.2 Elektronenr¨ohren-basierte Computer . . . 3

1.3 Transistor-basierte Computer . . . 4

2 Mikrocontroller und -prozessoren 6 2.1 Prozessoranschl¨usse . . . 6

2.2 Weitere Bausteine . . . 7

2.3 Status Register . . . 8

2.4 Stack Pointer und Program Counter . . . 9

2.5 General Purpose Register . . . 10

2.6 Instruction Decoder (Steuerwerk) . . . 10

2.7 Die Befehlsabarbeitung . . . 10

2.8 Rechnerarchitekturen . . . 11

3 Assembler 12 3.1 Unterschiede zu Hochsprachen . . . 12

3.2 Assembler . . . 12

3.3 Maschinenbefehle . . . 12

3.4 Adressierungsarten . . . 13

3.5 N¨utzliche Befehle . . . 13

3.6 Typische Adressen . . . 16

(3)

1 Entwicklung der Computer

Rechenhilfen gab es schon sehr lange: Vom Abakus, ¨uber napiersche Rechenst¨abchen in der Zeit der fr¨uheren Hochkulturen, zu Zahnrad-getriebenen Rechenmaschinen (z.B.

von Schickard) und Babbages

”Difference Engine“, bis schließlich der erste PC erfunden wurde.

1.1 Relais-basierte Computer

Die 1937 von Konrad Zuse erfundene, rein mechanische Z1 Rechenmaschine wurde bald schon – mit Umweg ¨uber die Z2 (1941) als Relais-Prototyp – 1943 die Z3 entwickelt.

Relais sind mit Spulen umwickelte Weichmagnete, die unter Strom ein Magnetisches Feld erzeugen, das einen Metallstab anzieht, dessen anderes Ende zwei Arbeitskontakte zusammendr¨uckt. So wurde die 0 und 1 umgesetzt. Die Z3 enthielt 1.400 Relais als Speicher, sowie 600 Relais zum Betreiben des Steuer- und Rechenwerks. Das Rechenwerk besaß 2 Register und der gesamte PC wog ca. eine Tonne. Die Z3 beherrschte die Gleitkommaberechnung und war w¨ahrend des Rechenvorgangs sogar interaktiv. Sie hatte 9 Befehle: Eingabe, Ausgabe, Speicher lesen, Speicher schreiben, multiplizieren, dividieren, Wurzelziehen, addieren, subtrahieren. Diese Befehle konnten direkt ¨uber ein Bedienfeld mittels Tastatur oder Lochstreifen ¨ubergeben werden.

Die Motivation von Zuse war die Erleichterung von numerischen Berechnungen in der Statistik.

Andere nennenswerte PCs waren der Atanasoff-Berry-Computer, Colossus, ENIAC und der Harvard Mark I. Letzterer wurde haupts¨achlich vom US-Amerikanischen Milit¨ar f¨ur ballistische Berechnungen verwendet.

Dieser PC pr¨agte zudem eine von zwei bedeutsamen Rechnerarchitekturen: die Harvard-Architektur, bei der Daten und Programme separat voneinander gespeichert werden. Die andere Architektur wirdVon-Neumann-Architekturgenannt; hier werden Programme und Daten im selben Speicher gelagert. Mehr Dazu wird in Punkt 2.8 behandelt.

1.2 Elektronenr¨ ohren-basierte Computer

Im sp¨ateren Verlauf gab es auch PCs, die nicht mithilfe von Relais, sondern durch Elektronenr¨uhren funktionierten. Elektronenr¨ohren haben eine Kathode und eine Anode, die durch ein Steuergitter getrennt sind. Hinter der Kathode ist eine Kathodenheizung – ist sie an, so erw¨armt sie die Kathode, sodass diese Elektronen abgibt, die zur Anode gezogen werden. Ist dies der Fall, so ist die Elektronenr¨ohre an (1). Wird das

(4)

Weitere Zusammenfassungen von Malte Jakob gibt es unter i-malte.jimdofree.com Steuergitter unter Strom gesetzt, so zieht dies die Elektronen an und lenkt diese wieder an die Kathode zur¨uck – es entsteht eine negative Spannung zwischen dem Gitter und der Kathode und die Elektronenr¨ohre ist aus (0).

1.3 Transistor-basierte Computer

Ab 1955 gab es auch Transistoren. Diese machten sich die Valenzelektronen zunutze.

Wenn ein Element, z.B. Germanium mit 4 Valenzelektronen,

”unter sich “ist, so kann ein stabiles Gitter aufgebaut werden, bei dem jedes Elektron einen Partner besitzt.

Wird dieses Gitter nun absichtlich mit Elementen anderer Wertigkeit verunreinigt (dotiert), so hat nicht jedes Elektron einen Partner.

Setzt man ein Element mit mehr Elektronen (z.B. Arsen) ein, so schwebt das Ubersch¨¨ ussige Valenzelektron frei umher – diese Gitter nennt man Elektronendonatoren und bilden denN-Halbleiter.

Dotiert man es stattdessen mit einem Element, das weniger Valenzelektronen besitzt (z.B. Indium), so entsteht ein

”Loch“im Gitter, das von umstehenden Elektronen immer nur zeitweise aufgef¨ullt werden kann, bevor sie zur¨uck an ihre alte Stelle schweben – diese Gitter nennt man Elektronenakzeptoren und bilden deP-Halbleiter.

F¨ugt man diese Halbleiter nun zusammen und legt den Pluspol eines Stromes an den P-Halbleiter (also fließen die Elektronen zuerst in den N-Halbleiter und dann in den P-Halbleiter), so werden die Elektronen im N-Halbleiter von den neuen Elektronen in den P-Halbleiter gestoßen und von dort vom Pluspol angezogen – es entsteht ein Strom in Durchlassrichtung.

Wird Der Pluspol stattdessen an den N-Halbleiter angeschlossen, werden die ¨uber- sch¨ussigen Elektronen direkt vom Pluspol angezogen – es entsteht keine Spannung, da der Strom in Sperrrichtung angeschlossen ist.

Oft wird die Richtung auch durch ein Dreieck mit Strich an der Spitze dargestellt, wobei die Spitze in Durchlassrichtung zeigt.

Bei 100V oder h¨oher ist der Strom jedoch so stark, dass der auch in Sperrrichtung fließt – dann ist der Halbleiter kaputt.

Transistoren bestehen aus drei solcher Halbleiter-Gitter, die entsprechend NPN oder PNP Transistoren heißen. Das mittlere Gitter ist in beide F¨allen sehr d¨unn und nur schwach dotiert. Diese unterschiedlichen Gebiete werden auch Emitter-, Basis- und Kollektor-Zone genannt.

Das erste Bauteil (Beispiel NPN Transmitter) NP ist in Durchlassrichtung geschaltet, das zweite Bauteil (PN) ist in Sperrrichtung geschaltet. Wird der Strom nun angeschaltet, so werden die Elektronen aus dem ersten N-Bauteil durch die neuen Elektronen in den P-Teil verschoben, wo sie teilweise die

”L¨ocher“stopfen. Der Strom, der am zweiten N- Bauteil in Sperrrichtung angeschlossen ist, ist jedoch so stark, dass die Elektronen, die vom ersten N-Bauteil in das P-Gitter verschoben wurden, nun von dem starken Strom angezogen werden und weiter in das zweite N-Bauteil fließen. So fließt ein Strom, der durch Regelung des kleineren Stroms sogar Verst¨arkt werden kann.

Heutzutage werden allerdings anstelle dieser bipolar-Transistoren Metal Oxide Semi- conductor Field Effect Transistoren (MOSFETs) verwendet. Hierbei sind zwei n-dotierte

(5)

Komponenten – Source und Drain – in einem p-dotierten Substrat und werden ¨uber ein Gate miteinander Verbunden. Wird das Gate unter positive Spannung gesetzt, so zieht es die Elektronen aus dem Substrat an, die daraufhin unter dem Gate liegen.

Durch diese vermehrte Anzahl an Elektronen im Substrat, k¨onnen die Elektronen in den n-dotierten Komponenten von Source nach Drain wandern.

(6)

2 Mikrocontroller und -prozessoren

Heutzutage ist all das nicht mehr in der Gr¨oße mehrerer Aktenschr¨anke, sondern sehr viel kleiner, z.B. in Mikroprozessoren und Mikrocontrollern. Der Unterschied zwischen diesen beiden ist lediglich, dass ein Mikrocontroller alle n¨otigen Bausteine (z.B. Speicherbl¨ocke) bereits auf dem Chip hat, wohingegen ein Mikroprozessor lediglich das”Hirn ohne K¨orper“ist.

2.1 Prozessoranschl¨ usse

Ein Prozessor hat viele verschiedene Ein- und Ausg¨ange, die jeweils einen anderen Zweck erf¨ullen. Hier werden beispielhaft die Anschl¨usse des IntelRM8080A erkl¨art:

A0 bis A15 (Drei Zust¨ande – output)

Diese Pins werden verwendet, um ¨uber den Adressbus eine gewisse Speicherstelle oder einen I/O-Port auszuw¨ahlen. Sie k¨onnen eine niedrige oder hohe Spannung haben. Zus¨atzlich haben sie noch den Zustand

”Hochohmig“, der kein Signal durchl¨asst.

D0 bis D7 (Drei Zust¨ande – input / output)

Uber diese Verbindungen werden Daten auf den Datenbus geschrieben oder¨ davon gelesen (deswegen Bi-direktional), und zwar von / auf die Stelle, die zuvor auf dem Adressbus spezifiziert wurde. Auch hier gibt es die drei zust¨ande.

SYNC (output)

Diese Verbindung gibt zu Beginn jedes Maschinenzyklus ein Signal ab, mit dem sich andere Bauteile synchronisieren k¨onnen, damit sie im selben Takt arbeiten.

DBIN (output)

das Data Bus IN-Signal zeigt den externen Schaltkreisen an, dass sich der Datenbus im Eingabemodus befindet.

READY (input)

Dieses Signal gibt dem 8080 an, dass die Daten von der Adresse, die er zuvor auf den Adressbus gelegt hat, nun auf dem Datenbus vorhanden sind. Zwischen Ablegen und dem READY signal, ist der Prozessor im Wait-zustand.

WAIT (output)

Zeigt an, dass sich die CPU im Wait-Zustand befindet

(7)

WR# (output)

Das negierte Write-Signal, signalisiert im low-Zustand, dass die Daten auf dem Datenbus stabil vorliegen und nicht ver¨andert werden.

HOLD (input)

Der Prozessor soll im Hold-Zustand den Adress- und Datenbus freigeben, um einem anderen Ger¨at denDirectMediaAccess (DMA) zu erm¨oglichen.

HLDA (output)

Ist dieses Signal an, so best¨atigt der Prozessor die HOLD-Anfrage und versetzt all seine Adress- und Datenbusausg¨ange in den Hochohmigen Zustand, sodass er keine Befehle mehr darauf setzen kann.

INTE (output)

Ist das Interrupt-Enable-Signal an, so d¨urfen externe Schaltkreise einen Interrupt senden, ist es aus, so sind interrupts nicht erlaubt. Dies ist z.B. beim Hochfahren wichtig, da diese Routine nicht unterbrochen werden darf.

INT (input)

Wird diesem Signal strom zugef¨uhrt, so wird ein Interrupt angefragt. Ist der Prozessor gerade mit warten oder intern mit anderen interrupts besch¨aftigt ist, ignoriert er diese Anfragen.

RESET (input)

Wird ¨uber diesen Eingang Strom zugef¨uhrt, so werden INTE, HLDA und der Program counter gel¨oscht. Nach einem Reset startet das Programm bei der Adresse 0.

1,∅2

Uber diese Zug¨¨ ange kann ein externer Takt zugef¨uhrt werden.

2.2 Weitere Bausteine

Zudem gibt es noch weitere Bausteine:

Accumulator

in modernen Prozessen gibt es keinen Accumulator mehr, da er durch general purpose-Register ersetz wurde. In ¨alteren Modellen wie dem 8080 wurden Verkn¨upfungen durchgef¨urt und das Ergebnis dort gespeichert. z.B. Durch den BefehlADD [register]

wurde der Inhalt des Registers auf den Inhalt des Accumulators addiert.

ALU

DieArithmeticLogical Unit ist ein elektronisches Rechenwerk, bei der die Art der Verkn¨upfung durch die Steuereing¨ange festgelegt wird.

FLAG Flip Flops

Die FLAG Flip Flops speichern Statusangaben basierend auf dem vorherigen

(8)

Weitere Zusammenfassungen von Malte Jakob gibt es unter i-malte.jimdofree.com Rechenergebnis (z.B. ¨Uberlauf oder Ergebnis = 0). Diese Statusangaben k¨onnen dann f¨ur Verzweigungen / Sprungbefehle verwendet werden.

Stack Pointer

Der Stack pointer zeigt auf die Speicheradresse, auf die als n¨achstes geschrieben wird. Soll gelesen werden, wird von der n¨achst h¨oheren Adresse gelesen (Der Stack w¨achst nach unten). Soll geschrieben werden, so wird die Adresse verwendet, auf die der Pointer zeigt.

Program Counter

Der Program counter zeigt auf die Speicherstelle, die den n¨achsten auszuf¨uhrenden Befehl enth¨alt.

Schwingquarz

Das Schwingquarz ist nicht teil des Prozessors, wird aber dennoch ben¨otigt, da es unter Strom in einer gleichm¨aßigen Frequenz schwingt und somit einen Takt / eine Zeiteinheit vorgeben kann, die die Basis f¨ur andere Zeiten ergibt.

2.3 Status Register

Im Status Register werden zus¨atzliche Informationen zu den Verkn¨upfungsergebnissen der ALU abgelegt. Ist das Ergebnis der Verkn¨upfung z.B. 0, so wird im Statusregister das zero-Flag gesetzt, auf das sich gewisse Assembler-Befehle St¨utzen (z.B.BREQ(Branch if Equal)).

Im Statusregister sind folgende Flags Vorhanden:

C Carry flag

Bei der Berechnung gab es einen ¨Ubertrag vom 8. auf das 9. Bit. Es konnte also nicht das gesamte Ergebnis im Byte gespeichert werden.

Z Zero flag

Das Ergebnis ist 0 N Negative flag

Ist der Wert des MSB auf 1 gesetzt, so wird angenommen, dass das Ergebnis negativ ist und daN-Flag wird gesezt

V Zweierkomplement Overflow-indikator

Ist dieses Flag gesetzt, so kann das Ergebnis nicht in 8 Bit dargestellt werden (SOmit tritt es gemeinsam mit dem C-Flag auf).

S Signierte Zahl

Eine Zahl ist signiert, wenn die XOR-Verkn¨upfung zwischen N und V 1 ergibt H Half Carry flag

Gibt es einen ¨Ubertrag vom 4. auf das 5. Bit, so wird dieses Flag gesetzt.

(9)

T Transfer Bit

Dieses Bit kann durchBLDundBST-Anweisungen verwendet werden.

I Globales Interrupt ein/aus

Je nach Status des I-Bits werden Interrupts zugelassen, oder nicht.

Diese 8 Flags werden in einem Byte aufbewahrt. Die Reihenfolge der Bits innerhalb eines Byte ist:

ITHSVNZC

2.4 Stack Pointer und Program Counter

Der Stack Pointer zeigt auf die Adresse im Stack, auf die als n¨achstes geschrieben wird. F¨ur die Addressierung der Adressen belegt der Pointer 2 Byte. Somit besteht der Stack Pointer aus einem

”low“- und einem

”high“-Teil, die gemeinsam den gesamten Adressbereich ansprechen k¨onnen. Der Stack Pointer kann durch folgendes ver¨andert werden:

Assembler-Befehle Anweisungen, die den Stack direkt manipulieren push Legt einen Wert auf dem Stack ab

pop Liest einen Wert vom Stack zur¨uck

Unterprogrammaufrufe und Interrupts Hier wird die R¨ucksprungadresse auf dem Stack gespeichert

call Eine Unterfunktion an Stellexwird ausgef¨uhrt (Befehl ben¨otigt 2 Worte) rcall Eine Unterfunktion, die x Zeilen vom jetzigen Punkt entfernt ist, wird

aufgerufen (Ben¨otigt nur 1 Wort).

R¨ucksprung aus Unterprogrammen Sie lesen die R¨ucksprungadresse vom Stack zur¨uck.

ret Adresse wird vom Stack zur¨uck-gelesen und der Program Counter wird auf diesen Wert gesetzt

reti Das selbe wie ret, allerdings werden hierbei noch interrupts durch den Befehl sei wieder aktiviert, die zuvor durch cli verboten wurden (wird bei interrupt-Routinen verwendet).

Zus¨atzlich m¨ussen entsprechende Bits in der EIMSK (Enable Interrupt Mask) auf 1 gesetzt werden (Bit 0 f¨ur Int0, Bit 1 f¨ur Int1 etc.). Dar¨uber hinaus m¨ussen Bits gesetzt werden, die steuern, wie ein Interrupt ausgel¨ost wird (z.B. Interrupt bei einem

”low“-Pegel).

DerProgram Counterzeigt auf den n¨achsten auszuf¨uhrenden Befehl. Zur Adressierung ben¨otigt er ebenfalls 2 Byte, die sich ebenfalls in

”high“- und

”low“-Teile aufspalten lassen. Er ver¨andert sich nach jedem Befehl. Bei einem 1-Wort-Befehl erh¨oht er sich um 1, bei 2-Wort-Befehlen um 2. Durch einenRESET-Befehl wird er auf 0 gesetzt.

(10)

Weitere Zusammenfassungen von Malte Jakob gibt es unter i-malte.jimdofree.com Zus¨atzlich kann er durch Befehle wie jump, rjump, branch, call, rcall ( das r steht wieder f¨ur relative) sowie durch interrupts auf einen speziellen Wert gesetzt werden. Bei interrupts muss beachtet werden, dass je nach Art des Interrupts an eine in der Sprung-Vektor-Tabelle definierte Stelle gesprungen wird (diese Eintrage sind jeweils ein 2-Wort jump-Befehl).

Die Adresse, die auf dem Stack als R¨ucksprungadresse angegeben ist, ist nicht die Adresse, auf die der Counter nach dem R¨ucksprung zeigt. Stattdessen ist die Adresse die R¨ucksprungadresse +1 (oder 2, wenn der Befehl in der R¨ucksprungadresse ein 2-Wort-Befehl ist).

2.5 General Purpose Register

General Purpose Register sind 1-Byte große Register, in die beliebige Werte gespeichert werden k¨onnen. Die Register 0-25 sind eigenst¨andig und je 1 Byte groß. Zus¨atzlich gibt es die Register X,Y, und Z, welche sich jeweils aus zwei aufeinanderfolgenden Registern ergeben (z.B. X besteht aus r26 und r27). Somit haben sie, genau wie der Program Counter und der Stack Pointer einen

”high“- und einen

”low“-Teil und k¨onnen aufgrund ihrer Gr¨oße Adressen speichern. Dies kann n¨utzlich f¨ur z.B. denld rD, rS- Befehl sein, der den Inhalt der Speicherstelle, die inrSadressiert wird inrDschreibt.

2.6 Instruction Decoder (Steuerwerk)

Der Instruction Decoder, auch Steuerwerk genannt, interpretiert die Daten aus dem Instruction-Register, welches Maschinencode enth¨alt, und leitet die n¨otigen Datentransfers und Rechenoperationen aus dem Maschinencode ab.

Eine Ansammlung an Maschinenbefehlen wird Maschinenprogramm oder object Code genannt. Diese Befehle werden einfach nacheinander abgearbeitet (sofern es keine Spr¨unge oder ¨Ahnliches gibt).

Das Steuerwerk bildet gemeinsam mit dem Rechenwerk (ALU) die CPU.

2.7 Die Befehlsabarbeitung

Beim Start eines Programms wird der Program Counter auf die Anfangsadresse des Programms gesetzt. Von da an, werden verschiedene Phasen durchlaufen:

1. Ladephase (Fetch-Phase)

Der durch den Counter adressierten Befehl wird aus dem Speicher in das Intruction Register geladen. Ein Befehl besteht immer aus einem Operationsteil, der spezifiziert welche Operation durchgef¨uhrt werden soll, und einem Adressteil, der spezifiziert, auf welchen Bereich dieser Befehl angewandt werden soll.

2. Update-Phase

Der Program Counter wird (je nach Gr¨oße des Befehls) um 1 oder 2 erh¨oht

(11)

3. Decode-Phase

Der Befehl wird im Intruction-Decoder entschl¨usselt 4. Execution-Phase

Der Befehl wird ausgef¨uhrt

F¨ur das Ausf¨uhren von Maschinenbefehlen, werden ein bis f¨unf machine cycles ben¨otigt. Ein machine cycle hingegen besteht aus drei bis f¨unf states. States sind die kleinsten Teile der Prozessoraktivit¨at. Er ist definiert als die Zeit zwischen zwei aufeinanderfolgenden aufsteigenden Flanken des ∅-Taktsignals. W¨ahrend dieser Zeit k¨onnen andere Bits auf dem Datenbus besetzt werden denen jeweils eine eigene Bedeutung beiwohnt. Die Kombination dieser States bileden einen machine cycle mit unterschiedlichen bedeutungen, wie z.B. Fetch, memory read, memory write etc.

2.8 Rechnerarchitekturen

Bei heutigen Systemen wird haupts¨achlich zwischen zwei großen Architektur-Typen unterschieden: Harvard und Von Neumann.

DieHarvard-Architektur trennt den Datenspeicher von dem Programmspeicher (oft hat der Datenspeicher eine Wortgr¨oße von 8 Bit und der Programmspeicher eine Wortgr¨oße von 16 Bit) und bietet f¨ur den Zugang zu den Speichern unterschiedliche Daten- und Befehlsbusse. Dies erm¨oglicht schnellen und simultanen Zugriff auf Daten und Code und werden h¨aufig bei Signalprozessoren verwendet.

DieVon Neumann- / Princeton-Architektur speichert Befehle und Daten im selben Speicher, was eine flexiblere Platzaufteilung f¨ur Daten und Code erm¨oglicht. Dies wird heutzutage bei den meisten allgemeinen Computern angewandt. Die Struktur der Von Neumann Architektur ist unabh¨angig des zu l¨osenden Problems.

Beide Formen zeichnen sich allerdings dadurch aus, dass die Befehle sequentiell abgearbeitet werden.

(12)

3 Assembler

3.1 Unterschiede zu Hochsprachen

Programme in Assemblersprachen zeichnen dich dadurch aus, dass alle M¨oglichkeiten des Mikroprozessors genutzt werden k¨onnen. Allerdings finden sie heutzutage nur noch dann Anwendung, wenn es sich um zeitkritische Systeme (z.B. Echtzeitsysteme) oder um Systeme mit sehr wenige Speicherplatz handelt (z.B. embedded Systems).

Zudem sind sie n¨utzlich, wenn man verstehen will, wie ein Rechner arbeitet, die Ausf¨uhrungszeit oder Speichernutzung optimieren m¨ochte, oder man Berechnungen auf einen bestimmten Prozessor mikro-optimieren m¨ochte.

Dem entgegen stehen die Vorteile von Hochsprachen:

• Ben¨otigt weniger Zeit zur L¨osung eines Problems

• Der Programmierer ben¨otigt nur Wissen ¨uber das System, wenn er I/O-Bausteine programmiert

• Der Compiler ¨ubernimmt die L¨osung vieler Probleme durch Programmbibliotheken

• Der Quellcode kann ohne Anpassung auf andere Systeme kopiert werden und braucht nur den passenden Compiler

3.2 Assembler

Ein Assembler ¨ubersetzt Quelldateien, die Assembler-Instruktionen (Mneonics), Sprung- marken (labels), oder Assembler-Direktiven (directives) enthalten, in Maschinensprache.

Hierbei wird jede Zeile des Codes in genau einen Maschinenbefehl ¨ubersetzt.

Bei der Quelldatei handelt es sich um eine .asm-Datei, aus der .lss, .map, .hex und.obj-Dateien generiert, von denen die ersten beiden Menschenlesbar sind, und die letzte Datei ausf¨uhrbar ist.

3.3 Maschinenbefehle

Ein Maschinenbefehl ist eine definierte Folge an 0-en und 1-en, der eine Bedeutung innewohnt. Beispielsweise wird der Assembler-BefehlMOV r1, r2zu01dddsss¨ubersetzt, wobei d und s jeweils durch die Bits zur Adressierung der Register ersetzt werden. Die 01definiert hierbei denMOV-Befehl.

(13)

3.4 Adressierungsarten

Es gibt mehrere Arten, gewisse Bereiche zu adressieren; diese sind:

Register Direct (1): Hier wird ein Register direkt angesprochen. Zus¨atzliche Info- rmationen (z.B. zu speichernder Wert) sind direkt im Code erhalten.

Bsp.:ldi Rd,k

Register Direct(2): Hier werden zwei Register direkt angesprochen. Die zu verkn¨upf- enden Inhalte sind darin gespeichert.

Bsp.:mov Rd,Rr

I/O Direct: Hier werden Register ¨uber I/O-Befehle angesprochen. Hierf¨ur werden die speziellen I/O-Adressen verwendet (Normale Adresse - 0x20). Extended I/O- Register k¨onnen nur ¨uber direkte Datenadressierung angesprochen werden.

Bsp.:in Rd,a oderout a,Rr

Data Direct: Die Adresse unter der ein Registerinhalt gespeichert / von dem ein Wert geladen wird ist in einem zweiten Befehlswort enthalten.

Bsp.:lds Rd,k odersts k,Rr

Data indirect: Die Adresse, von der gelesen/auf die geschrieben werden soll, befindet sich im X-, Y-, oder Z-Register. Hierbei k¨onnen die Register zus¨atzlich von einem Post-/Pre- Increment oder Decrement manipuliert werden. Ebenso ist das Laden mit Displacement m¨oglich.

Bsp.:ld Rd,(+/-)X/Y/Z(+/-) oderst (+/-)X/Y/Z(+/-),Rr Alternativ:ldd Rd,X/Y/Z+qoderstd X/Y/Z+q,Rr

Alternativ:lpm Rd,X/Y/Z

Direct program addressing: Hier wird die Adresse des n¨achsten auszuf¨uhrenden Befehls direkt im Befehl angegeben.

Bsp.:jmp kodercall k

Indirect program addessing: Hier wird die Adresse nicht im Code angegeben, sondern steht im Z-Register.

Bsp.:ijmpodericall

Relative program addressing Hier wird relativ zum aktuellen PC gesprungen (z.B.

f¨unf Worte weiter / zur¨uck).

Bsp.:rjmp koderrcall k

3.5 N¨ utzliche Befehle

ldi (Load Immediate) –ldi Rd,k.

dmuss hierbei zwischen 16 und 31 (beides inklusive) liegen. K kann Werte von 0 bis 255 annehmen.

Dieser Befehl schreibtkin das angegebene Register.

(14)

Weitere Zusammenfassungen von Malte Jakob gibt es unter i-malte.jimdofree.com

mov (move) –mov Rd,Rr

rundd k¨onnen Werte zwischen 0 und 31 annehmen. Der Befehl Speichert den Inhalt ausRrinRd.

in/out –in Rd,aoderout a,Rr

dundrk¨onnen Jeweils die Werte 0 bis 31 annehmen und spricht die entsprechenden Register an.akann zwischen 0 und 63 variieren und spricht die 64 I/O-Register an. 0 entspricht hierbei der Adresse 0x20, 1 der Adresse 0x21 usw.. Auch der Stackpointer (Adressen 0x5E und 0x5D) kann so angesprochen werden.

Es werden dementsprechend Daten aus einem der normalen Register in ein I/O- Register geladen oder anders herum.

lds (load directly from data storage) –lds Rd,k

dkann zwischen 0 bis 1, undkzwischen 0 bis 65535 variieren. Bei diesem Befehl werden in das angegebene Register die Daten geladen, die an der spezifizierten Stelle liegen.

sts (store directly to data storage) –sts k,Rr

F¨urrundkgelten die selben Werte wie oben. Bei diesem Befehl werden auf die spezifizierte Adresse die Daten aus dem angegebenen Register geschrieben.

ld und st (load/store indirect) –ld Rd,(+/-)X/Y/Z(+/-)oderst (+/-)X/Y/Z(+/-),Rr dreicht von 0 bis 31. Hier wird die Adresse, die in dem angegebenen Indexregister steht gelesen/beschrieben. Zus¨atzlich kann ein + oder - hinzugef¨ugt werden, das die Adresse um 1 erh¨oht/erniedrigt und wieder im Indexregister speichert. Je nachdem, ob der Operator vor oder nach dem Register steht, wird diese ¨Anderung vor oder nach dem Lesen der Adresse durchgef¨uhrt.

ldd und std (load/store indirect with displacement) –ldd Rd,X/Y/Z+qoderstd X/Y/Z+q,Rr d reicht von 0 bis 31 und q von 0 bis 63. Hier wird die Adresse, die in dem angegebenen Indexregister+qsteht gelesen/beschrieben. Anders als beim Increment/

Decrement wird die im Indexregister gespeicherte Adresse hierbei nicht gespeichert.

lpm (load from program memory) –lpm Rd,X/Y/Z

dkann zwischen 0 und 31 liegen.lpml¨adt ein Byte aus dem Programmspeicher, auf das das angegebene Indexregister zeigt, und speichert es in das Zielregister.

So k¨onnen vorbelegte Konstanten aus dem Programmspeicher in den SRAM gespeichert werden. Da der Programmspeicher 16-Bit-Worte nutzt, Indexregister allerdings nur ein Byte ansprechen, kann entweder das untere, oder das obere Byte angesprochen werden. Dies wird verdeutlicht, indem das LSB des Indexregisters

= 0 (unteres Byte), oder = 1 (h¨oheres Byte) ist.

jumps – jmp koderijmpoderrjmp k

Die Adresse des Programcounters wird ver¨andert. Beijmpdarf kbis ¨uber 4 Mio.

steigen und kann somit alle m¨oglichen Adressen direkt ansprechen, an der ein Befehl stehen kann. Beiijmpwird zu der ADresse gesprungen, die im Z-Register steht. Beirjmp kann kWErte zwischen -2.000 und 2.000 annehmen. Hier wird

(15)

der Wert von k auf den aktuellen PC addiert. So wirdrelativ zum aktuellen Wert gesprungen.

calls –call kodericalloderrcall k

call funktioniert ebenso wie jmp, allerdings springt es nach dem Ausf¨uhren der Subroutine auf die alte Stelle zur¨uck (hierf¨ur wird eine R¨ucksprungadresse auf den Stack gelegt). Bei call, kann k bis zu ca. 64.000 anwachsen (bei max.

Programmspeicher von 128KB), oder bis zu ca. 4 Mio. (bei max. Programmspeicher von 8MB). Ansonsten funktionieren die anderen Befehle analog zu den jmp- Befehlen.

ret und reti (return und return from interrupt) – retoderreti

Dieser vefehl liest eine Adresse vom Stack und springt dort hin. Bei return from interrupt werden interrupts wieder zugelassen.

eor(und cls) (exclusive or (clear)) –eor Rd,Rr

rund d reichen von 0 bis 31. Diese BEfehl f¨uhrt ein exklusives bitweises Oder zwischen den beiden Registern aus und speichert das Ergebnis inRd. Der Befehl cls Rdmacht eigentlich nichts anderes alseor Rd,Rd.

nop (no operation) –nop Dieser Befehl macht nichts.

inc/dec (increment/decrepemt) –inc Rdoderdec Rd

Dieser Befehl erh¨oht/erniedrigt den Inhalt des Registers um 1. Ergebnisse ¨uber die Rechnung werden im SREG gespeichert.

add (addition) –add Rd,Rr

Dieser Befehl addiert die Werte inRdundRrund speichert sie inRr. Informationen

¨

uber die Rechnung werden im Statusregister abgelegt.

adc (add with carry) –adc Rd,Rr

Dieser befehl addiert die Ihalte aus den beiden Registern,sowie das Carry-Flag aus dem SREG, und speichert das Ergebnis in Rd. Informationen werden im SREG gespeichert.

cpi (compare with immediate) –cpi Rd,k

d kann zwischen 16 und 31, k zwischen 0 und 256 liegen. Der Befehl zieht k von dem Inhalt ausRdab und speichert die informationen ¨uber die Rechnung im SREG.

cpc (compare with carry) –cpi Rd,Rr

Hier k¨onnen alle Register ge¨ahlt werden. Der Inhalt dieser Register und die Carry-Flag aus dem SREG werden voneinander abgezogen und Informationen

¨

uber diese Rechnung im SREG gespeichert.

breq/brne/brcs (branch if (not) equal/carry set) – breq koderbrne koderbrcs k Der Program-Counter wird um k (zwischen -64 und 63) erh¨oht/erniedrigt, wenn

(16)

Weitere Zusammenfassungen von Malte Jakob gibt es unter i-malte.jimdofree.com das Zero-Flag im SREG gesetzt (breq) bzw. nicht gesetzt (brne) ist oder, wenn das Carry-Flag gesetzt ist (brcs).

.EQU (equals) – .EQU var-name=1-Byte-value

Legt eine ”Variable”fest. Beim Assembler-Vorgang wird jedes Vorkommen des Variablennamens durch den Wert ersetzt.

.DEF (define) –.DEF var-name=register

Hiermit wird einem Register ein symbolischer Name zugewiseen. dies kann mittels .UNDEFwieder aufgel¨ost werden.

.DSEG (Data segment) –.DSEG

beginnt ein Data-Segment. Diese Segmente enthalten meist nur .BYTE-Befehle und labels (name:). Variablen im DSEG sind in der Regel 8 Bit groß.

.CSEG (Code segment) –.CSEG

Beginnt ein Code-Segment. Hier steht der eigentliche Code des Assembler-Programms.

Variablen im CSEg sind in der Regel 16 Bit groß.

.Byte (byte) –var-name:.BYTE k

unter der Variable wird der Adresswert f¨ur eine k-Byte große variable abgelegt.

.DW (define constant word(s)) –var-name:.DW 2-byte-value(,2-byte-value,...) Mit diesem Befehl k¨onnen eine oder mehrere konstante Werte definiert und im entsprechenden Segment gespeichert werden. Ebenfalls git es.DBoder.DD, die nur ein Byte, oder ein ”Double-Word”(4 byte) definieren.

.org (origin) –.org value

Dieser Befehl gibt die Startadresse des Segments an.

3.6 Typische Adressen

Das SRAM ist im AtMega328P wie folgt aufgeteilt: 0x0000 - 0x001F: Register 0 - 31 0x0020 - 0x005F: I/O-Register (letzte zwei Adressen f¨ur Stackpointer)

0x0060 - 0x00FF: 160 externe I/O-Register 0x0100 - 0x08FF: Internes SRAM.

0x08FF wird oft auch alsRAMENDbezeichnet. Im internen SRAM ist es meist so, dass die Variablen auf dem Heap abgelegt werden, der von 0x0100 ab nach unten w¨achst, w¨ahrend der Stack beiRAMENDbeginnt und nach oben w¨achst.

Referenzen

ÄHNLICHE DOKUMENTE

Karlsruher Institut f¨ ur Technologie (KIT) Institut f¨ ur

Fachbereich Mathematik, TU-Darmstadt Zusammenfassung der Vorlesung vom

The intermolecular constraints obtained under the same conditions in the present study reveal a close interaction between different R S molecules, which could also explain the

[r]

Landmarks, network flows and potential heuristics are based on constraints that can be specified for a planning task.... Constraint-based Heuristics Multiple

Same algorithm can be used for disjunctive action landmarks, where we also have a minimal saturated cost function. Definition (MSCF for Disjunctive

Quality of given policy π can be computed (via LP or backward induction) or approximated arbitrarily closely (via iterative policy evaluation) in small SSPs or MDPs Impossible

L¨ osung: Sei die Funktion f : [a, b] → R stetig ¨ uber dem (nicht- leeren) Intervall [a, b] und differenzierbar ¨ uber ]a, b[.. und berechnen