28.04.2014 Aufrufe

Übungsblatt 1 - LRR - TUM

Übungsblatt 1 - LRR - TUM

Übungsblatt 1 - LRR - TUM

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

FAKULTÄT FÜR INFORMATIK<br />

TECHNISCHE UNIVERSITÄT MÜNCHEN<br />

Lehrstuhl für Rechnertechnik und Rechnerorganisation<br />

Prof. Dr. Arndt Bode<br />

Einführung in die Rechnerarchitektur (ERA)<br />

Wintersemester 2013/2014<br />

Zentralübung 1 08.11.2013<br />

Maschinennahe Programmierung (1)<br />

Grundlagen der Boolschen Algebra<br />

Darstellung ganzer Zahlen<br />

Inhalte: Boolsche Algebra, Operatoren, Zahlensysteme, Datenformate, ganzzahlige Arithmetik<br />

auf Intel 80386-Prozessoren<br />

Boolsche Algebra<br />

oder: ”<br />

Was alles mit nur zwei Werten geht“<br />

Fast alle Komponenten eines Computers arbeiten heute digital und im Binärsystem, das heißt<br />

sie können nur zwischen 0 und 1 unterscheiden. Diese Einschränkung erlaubt eine sehr einfache<br />

technische Umsetzung verschiedenster Rechenvorschriften und Zahlenwerte. Im folgenden soll<br />

etwas näher untersucht werden, warum das so ist, und welche Regeln für das Rechnen mit 0<br />

und 1 gelten.<br />

☞ Was heisst eigentlich ”<br />

analog“, ”<br />

diskret“, ”<br />

digital“ und ”<br />

binär“ (Nachschlagen im Lexikon)?<br />

Technische Darstellung von diskreten Werten<br />

Üblich sind die Identifikation der Werte 0 und 1 mit Werten physikalischer Größen wie Spannung<br />

oder Strom. Eine bis heute gängige Norm ist z. B.:<br />

Wert 0 ˆ= 0 V ˆ= Low-Pegel (Eingang: 0-0,8V, Ausgang: 0-0,5V)<br />

Wert 1 ˆ= 5 V ˆ= High-Pegel (Eingang: 2,2V-5V, Ausgang: 2,7V-5V)<br />

Da diese Werte natürlich nie genau erreicht werden können, gibt es Bereiche, die auf 0 bzw.<br />

1 abgebildet werden (Werte für die sog. TTL-Pegel in Klammern). Dabei haben Ausgänge ein<br />

1


engeres erlaubtes ”<br />

Fenster“ als Eingänge, damit eine einfache Verbindung von Ausgängen mit<br />

Eingängen möglich wird.<br />

Zunehmend werden heutzutage allerdings als High-Pegel auch Werte von 3, 3 V , 2, 5 V oder<br />

niedriger verwendet, um die in elektrischen Schaltungen auftretenden Verluste niedrig zu halten.<br />

☞ Welche anderen physikalischen Größen kennen Sie oder können Sie sich zur Repräsentation<br />

der Werte 0 und 1 vorstellen?<br />

Schaltfunktionen (Beispiele)<br />

Um nun mit 0 und 1 wirklich ”<br />

rechnen“ zu können, braucht man Funktionen, die einen oder<br />

mehrere Eingabewerte verarbeiten und einen oder mehrere Ausgabewerte daraus erzeugen.<br />

Von diesen Funktionen gibt es natürlich (beliebig?) viele. Es existieren allerdings einige wenige<br />

Funktionen, mit denen man alle anderen nachbilden kann.<br />

Identität: Ein Eingang, ein Ausgang.<br />

Diese Funktion macht gar nichts, sie gibt den Eingangswert einfach an den Ausgang weiter.<br />

Technisch gesehen ist das am einfachsten mit einem Stück Draht realisierbar, es gibt aber<br />

manchmal doch elektrische Gründe, warum man diese Funktion als echten Baustein benötigt.<br />

Schreibweise: a = e<br />

Negation/Inverter/NICHT/NOT/NEG: Ein Eingang, ein Ausgang.<br />

Diese Funktion vertauscht den Eingangswert, eine 0 wird am Ausgang eine 1, eine 1 wird eine<br />

0.<br />

Schreibweisen:<br />

a = e oder a = /e oder a = NOT e oder a = NEG e oder a = ¬e<br />

UND-Funktion/AND: Zwei Eingänge, ein Ausgang.<br />

Nur wenn an beiden Eingängen eine 1 anliegt, wird der Ausgang 1, ansonsten wird er 0.<br />

Schreibweisen:<br />

a = e 1 e 2 oder a = e 1 AND e 2 oder a = e 1 ∗ e 2 oder a = e 1 &e 2 oder a = e 1 ∧ e 2<br />

ODER-Funktion/OR: Zwei Eingänge, ein Ausgang.<br />

Wenn an einem oder an beiden Eingängen eine 1 anliegt, wird der Ausgang 1, ansonsten (wenn<br />

beide Eingänge 0 sind) wird er 0.<br />

Schreibweisen:<br />

a = e 1 + e 2 oder a = e 1 OR e 2 oder a = e 1 ∨ e 2<br />

Vorsicht: Das +“ wird hier benutzt, weil es gewisse Ähnlichkeiten mit der Addition gibt. Ob<br />

”<br />

” +“ jetzt ” OR“ oder Addition“ bedeutet, ist meistens aus dem Zusammenhang zu erkennen.<br />

”<br />

Eine Erweiterung von UND/ODER auf mehr als zwei Eingänge ist problemlos möglich:<br />

UND: Alle Eingänge müssen 1 sein, um eine 1 am Ausgang zu erhalten.<br />

2


ODER: Einer oder mehrere der Eingänge müssen 1 sein, um eine 1 am Ausgang zu erhalten.<br />

Zur Darstellung in Schaltplänen besitzen die obigen Funktionen auch grafischen Symbole (nach<br />

DIN):<br />

neu<br />

alt<br />

neu<br />

alt<br />

e<br />

1<br />

a<br />

e a e<br />

a e a<br />

1<br />

Identität<br />

Negation<br />

e1<br />

e2<br />

neu<br />

&<br />

a<br />

e1<br />

e2<br />

alt<br />

a<br />

e1<br />

e2<br />

neu<br />

1<br />

a<br />

e1<br />

e2<br />

alt<br />

UND<br />

ODER<br />

Schaltfunktionen (formal)<br />

Eine Schaltfunktion ist die mathematische Modellierung von Funktionen, die als Definitionsbereich<br />

einen Vektor von 0- bzw. 1-Werten erhalten und daraus einen skalaren Wert oder einen<br />

Vektor der Menge {0, 1} ableiten.<br />

Wir können uns solche Schaltfunktionen als Schaltsymbole beispielsweise wie folgt veranschaulichen:<br />

n Eingänge<br />

n Eingänge<br />

m Ausgänge<br />

1-dimensionale (1-stellige)<br />

Schaltfunktion<br />

m-dimensionale (m-stellige)<br />

Schaltfunktion<br />

Darstellung von Schaltfunktionen<br />

Eine Schaltfunktion läßt sich auf unterschiedliche Weise vollständig beschreiben:<br />

• Als Wahrheitstabelle:<br />

e 0 . . . e n−1<br />

.<br />

(Definitionsbereich<br />

bzw. Eingänge)<br />

.<br />

a 0 . . . a m−1<br />

.<br />

(Wertebereich<br />

bzw. Ausgänge)<br />

.<br />

In einer vollständigen Beschreibung muß der gesamte Definitionsbereich angegeben sein.<br />

3


• Als algebraischer Ausdruck:<br />

a 0 = e 0 e 1 e 2 + e 0 e 1 e 2 + . . .<br />

✎ Es existieren noch weitere alternative Darstellungen wie z. B. das Karnaugh-Veitch-<br />

Diagramm, auf die jedoch im weiteren nicht eingegangen werden soll.<br />

☞ Wie sehen NOT, AND und OR in Wahrheitstabellendarstellung aus?<br />

Algebraische Darstellung von Schaltfunktionen<br />

Durch Verwendung der booleschen Operatoren NEG, UND und ODER lassen sich alle beliebigen<br />

Schaltfunktionen auch algebraisch darstellen. Folgende Tabelle verdeutlicht die Zuordnung<br />

von algebraischen Objekten zu Schaltungskomponenten:<br />

Boolesche Algebra<br />

Variablen, Ausdrücke<br />

Verknüpfungen (NEG, UND, . . . )<br />

Schaltung<br />

Signale<br />

Gatter<br />

Für die Kombination von verschiedenen UND/ODER/NICHT-Gattern gibt es eine Reihe von<br />

Regeln, einige besonders wichtige sind:<br />

Involution: (f) = f<br />

Idempotenz: f ∗ f = f und f + f = f<br />

de-Morgan: f ∗ g = f + g und f + g = f ∗ g<br />

Im Bereich ”<br />

Schaltungsentwurf“ werden noch mehr dieser Regeln erläutert.<br />

Zahlsysteme<br />

Wir beginnen mit einem historischen Rückblick und vergleichen am Beispiel der Jahreszahl<br />

1999 das römische und das arabische Zahlsystem:<br />

Römisches Zahlsystem: MCMXCIX<br />

M CM XC IX<br />

1000 +(1000 − 100) + (100 − 10) + (10 − 1)<br />

Symbol Wert<br />

M 1000<br />

D 500<br />

C 100<br />

L 50<br />

X 10<br />

I 1<br />

Arabisches Zahlsystem: 1999<br />

4


1 9 9 9<br />

1 · 10 3 + 9 · 10 2 + 9 · 10 1 + 9 · 10 0<br />

☞ Welches Merkmal macht den entscheidenden Unterschied des arabischen zum römischen<br />

System der Zahldarstellung aus ?<br />

Aus dem täglichen Leben vertraut ist das Dezimalsystem sowie Algorithmen für die Grundrechenarten,<br />

nämlich die Verfahren zur Addition, Subtraktion, Multiplikation und Division ”<br />

auf<br />

dem Papier“.<br />

Heute verwendete Zahlsysteme basieren auf der Radixschreibweise zu einer Basis B. Eine Zahl<br />

wird dargestellt als<br />

Ihr Wert berechnet sich als<br />

a n a n−1 . . . a 3 a 2 a 1 a 0 (1)<br />

a =<br />

n∑<br />

a i · B i (2)<br />

i=0<br />

Für das Dezimalsystem gilt B = 10. Weitere gebräuchliche Systeme sind:<br />

B Bezeichnung<br />

2 Binärsystem<br />

8 Oktalsystem<br />

16 Hexadezimalsystem ( Hex“) ”<br />

Korrekterweise sollte das System mit Basis 16 eigentlich Sedezimalsystem heißen, der Ausdruck<br />

wird aber seltener benutzt.<br />

☞ Warum sind gerade diese Systeme in der Informatik gebräuchlich ?<br />

☞ Was ist zum Fall B = 1 zu sagen?<br />

Für die Symbole a i werden die Ziffern 0 . . . B − 1 verwendet, im Hexadezimalsystem werden<br />

die Symbolwerte 10 . . . 15 durch die Buchstaben A . . . F dargestellt. Die Zahlbasis wird als<br />

tiefgestellter Index an die Zahl angehängt (falls es nicht offensichtlich ist). Beispiele:<br />

binär oktal dezimal hexadezimal<br />

111100 2 74 8 60 10 3C 16<br />

11001 2 31 8 25 10 19 16<br />

Hinweis: In C wird oktal durch eine vorangestellte ’0’ (Null) markiert (z.B. 074), hexadezimal hat ein<br />

’0x’-Präfix (z.B. 0x3c). Für Assembler gibt es verschiedene Notationen, z.B. bei Intel-Assembler ein<br />

nachgestelltes h (3ch), bei Motorola ein vorangestelltes $ ($3c).<br />

☞ Versuchen Sie obige Beispiele nachzuvollziehen und vervollständigen Sie dann die nachfolgende<br />

Tabelle:<br />

5


inär oktal dezimal hexadezimal<br />

1110000 2<br />

120 8<br />

321 10<br />

AB 16<br />

Darstellung von Zahlen im Rechner<br />

Im Rechner werden Zahlen als das Bit-Muster dargestellt, das ihrer Binärdarstellung entspricht.<br />

Beispiel<br />

Dezimal Binärdarstellung Darstellung im Prozessor<br />

6 10 110 2 0 0 0 0 0 1 1 0<br />

☞ Welcher Zahlbereich kann dargestellt werden, wenn das Zahlformat wie im obigen Beispiel<br />

8 Bit breit ist ?<br />

☞ Führen Sie folgende Operationen nach den bekannten Regeln für das Rechnen auf dem<br />

”<br />

Papier“ aus, zunächst in Dezimaldarstellung, dann in Binärdarstellung. Die aus der Dezimalrechnung<br />

bekannten Regeln sind dabei direkt auf das binäre Zahlsystem zu übertragen.<br />

1. 6 + 7<br />

2. 127 − 53<br />

3. 6 × 7<br />

☞ Welchen logischen Verknüpfungen entsprechen die Elementaroperationen auf den einzelnen<br />

Stellen bei der Addition (Summe und Übertrag) ?<br />

☞ Welcher Funktion entspricht das Rechnen mit einer beschränkten Stellenzahl?<br />

Bit und Byte<br />

Für bestimmte Zusammenfassungen von Bits gibt es gebräuchliche Bezeichnungen:<br />

Anzahl der Bits Bezeichnung Wertebereich<br />

4 Bit 1 Nibble 0...15 bzw. -8...7<br />

8 Bit 1 Byte (1 Octett) 0...255 bzw. -128...127<br />

16 Bit 1 Word 0...65535 bzw. -32768...32767<br />

32 Bit 1 Long Word (Double Word) 0...4294967295<br />

bzw. -2147483648...2147483647<br />

64 Bit 1 Quad Word Sei dem Leser überlassen :-)<br />

6


Negative Zahlen<br />

Bislang haben wir nur positive Zahlen betrachtet. Bei arithmetischen Operationen unterscheidet<br />

man zwei Datentypen für ganze Zahlen: vorzeichenlos (unsigned) und vorzeichenbehaftet<br />

(signed). Sie unterscheiden sich in der Zahlcodierung sowie im darstellbaren Zahlbereich.<br />

Während positive Zahlen direkt durch das ihrer Binärdarstellung entsprechende Bitmuster<br />

repräsentiert werden, gibt es für negative Zahlen mehrere Möglichkeiten der Codierung. Die<br />

geläufigsten sind nachfolgend beschrieben.<br />

Einer-Komplement<br />

Beim Einer-Komplement erhält man die Darstellung einer negativen Zahl aus der Darstellung<br />

der entsprechenden positiven Zahl, indem man diese bit-weise invertiert. Der darstellbare Zahlbereich<br />

ist bei Verwendung eines 8 Bit breiten Datenformats [−127; +127].<br />

Beispiel:<br />

Dezimal<br />

Einer-Komplement-Darstellung im Prozessor<br />

38 10 0 0 1 0 0 1 1 0<br />

−38 10 1 1 0 1 1 0 0 1<br />

☞ Wie erkennt man am einfachsten, ob eine Zahl positiv oder negativ ist ?<br />

☞ Haben alle Zahlen eine eindeutige Darstellung?<br />

Zweier-Komplement<br />

Das Zweier-Komplement erhält man durch Addition von Eins zum Einer-Komplement. Im<br />

obigen Beispiel erhält man also<br />

Dezimal<br />

Zweier-Komplement-Darstellung im Prozessor<br />

−38 10 1 1 0 1 1 0 1 0<br />

☞ Berechnen Sie mit 9 Bit Stellenanzahl (256 - 38) und vergleichen Sie mit obigem Ergebnis.<br />

Welche Beziehung läßt sich daraus erkennen ?<br />

Vorzeichen, Übertrag und Überlauf<br />

Das höchstwertige Bit zeigt in beiden Komplement-Darstellungen das Vorzeichen der Zahl an.<br />

Ist es gesetzt, also a n−1 = 1, so ist die Zahl negativ, andernfalls ist sie positiv.<br />

Entsteht bei einer arithmetischen Operation ein Übertrag aus der höchstwertigen Stelle a n−1<br />

in die (im Datenformat nicht mehr vorhandenen) Stelle a n so wird das Carry Flag gesetzt.<br />

7


Addition bzw. Subtraktion kann man sich in der Zweierkomplementdarstellung am Zahlenrad<br />

veranschaulichen das in Abbildung 1 für ein 4-Bit Datenformat dargestellt ist. Der Zeiger<br />

markiert den aktuellen Wert der Zahl. Addition einer (positiven) Zahl c bedeutet den Zeiger<br />

um c Positionen nach rechts (gegen den Uhrzeigersinn) zu drehen. Bei der Subtraktion wird<br />

in die andere Richtung gedreht. Ein Überlauf liegt vor, wenn dabei die eingezeichnete Barriere<br />

überschritten wird (das Überschreiten wird manchmal auch ”<br />

Wrap-Around“ genannt)<br />

-8<br />

-6 -7 7<br />

6<br />

-5<br />

5<br />

-4<br />

4<br />

-3<br />

3<br />

-2<br />

-1 1 2 0<br />

Abbildung 1: Illustration der Addition im Zweierkomplement am Zahlrad<br />

Zusammenfassung:<br />

Übertrag (engl. carry) kann bei der Addition/Subtraktion von einzelnen Bitstellen entstehen<br />

und wirkt auf die nächsthöhere Bitstelle. Das Entstehen von Carry-Bits ist normal und<br />

daher zunächst ”<br />

harmlos“, eine besondere Behandlung in der höchsten Bitstelle ist nur bei<br />

vorzeichenlosen Zahlen notwendig.<br />

Überlauf (engl. overflow) entsteht bei der Überschreitung des Wertebereichs des Ergebnisses.<br />

Da mit dem Ergebnis normalerweise so nicht mehr weitergerechnet werden kann, muss dieser<br />

Zustand erkannt werden und passend darauf reagiert werden. Ein Überlauf ist i.A. nicht normal.<br />

☞ Unter welchen Voraussetzungen kann es bei Addition und Subtraktion zum Überlauf kommen<br />

?<br />

☞ Führen Sie folgende Berechnungen unter der Annahme eines 4-Bit Datenformats (vorzeichenbehaftet)<br />

durch und geben Sie jeweils an, ob es einen Übertrag aus dem höchstwertigen<br />

Bit ins Carry Flag sowie einen Überlauf gegeben hat.<br />

4 + 7 4 + 3 2 − 7 −2 + (−8)<br />

−3 − 7 (−8) + 7 (−3) + (−3) (−2) − (−8)<br />

Beispiel:<br />

Dezimal Zweier-Komplement-Darstellung Erläuterung<br />

−2 1110<br />

+(−8) 1000<br />

1000 (Carrybits der einzelnen Stellen)<br />

+6 (1)0110 (oberstes Carry-Flag in Klammern dargestellt)<br />

Carry-Flag 1 d.h. ja<br />

Überlauf 1 d.h. ja<br />

☞ Wie kann ein Überlauf anhand der Carrybits festgestellt werden? Gibt es noch eine andere<br />

Möglichkeit?<br />

8


Ganzzahlige Arithmetik mit dem 80386<br />

Grundlagen zum Programmiermodell des 80386<br />

Um Daten (z.B. Zahlenwerte) zu verarbeiten, werden diese bei fast allen Prozessoren in sog.<br />

Registern gespeichert. Der Intel 80386 hat dazu vier Allzweck-Datenregister mit den Namen<br />

EAX, EBX, ECX, EDX von je 32 Bit Breite, in denen Operanden und Ergebnisse arithmetischer<br />

und anderer Operationen gespeichert werden können. Damit können also je nach Interpretation<br />

der Register Werte zwischen -2 31 und 2 31 − 1 oder zwischen 0 und 2 32 − 1 dargestellt werden.<br />

Eine Besonderheit der Intel 80386 Prozessoren ist, daß sich jedes der vier Register aus der<br />

Data-Gruppe (EAX, EBX, ECX und EDX) auch noch in 16Bit und als ”<br />

Registerpaar“ aus<br />

zwei 8-Bit Registern ansprechen läßt (siehe Abb. 2).<br />

31<br />

15<br />

8<br />

7<br />

0<br />

EAX<br />

AH<br />

AL<br />

EAX<br />

AX<br />

BH<br />

BX<br />

BL<br />

EBX<br />

CH<br />

CX<br />

CL<br />

ECX<br />

DH<br />

DX<br />

DL<br />

EDX<br />

SI<br />

ESI<br />

DI<br />

EDI<br />

BP<br />

EBP<br />

Abbildung 2: Registernamen der wichtigsten 80386-Register<br />

Das 32-Bit Wort, das in einem Data-Register (z. B. EAX) gespeichert ist, ist mit seinen unteren<br />

16Bit in AX zugreifbar. AX ist wiederum in das niederwertige Byte (low byte) und das<br />

höherwertige Byte (high byte) geteilt. Über die zusätzlichen Registernamen AL (AX Low) und<br />

AH (AX High) lassen sich dann das Low-Byte bzw. das High-Byte des EAX/AX Registers<br />

ansprechen. Hieraus folgt natürlich, daß EAX, AX, AL und AH nicht unabhängig voneinander<br />

benutzbare Register sind! Zum Beispiel sich der Wert von AX als 256 × AH + AL. Analoges<br />

gilt für das EBX, das ECX und das EDX Register.<br />

Weitere Register<br />

Es gibt mit ESI, EDI und EBP noch drei weitere ”<br />

fast-Allzweck“ Register, diese sind aber<br />

ausschließlich mit 16 oder 32Bit nutzbar, es gibt aus historischen Gründen keine 8Bit-Teile.<br />

Einen Gesamtüberblick aller 80386-Register gibt es in der nächsten Übung.<br />

9


Assembler<br />

Die Befehle eines Prozessors sind zunächst verschiedene Zahlenkombinationen, sog. ”<br />

Opcodes“<br />

(=Operation Codes, beim 80386 typ. 1-16 Bytes lang), die die auszuführende Aktion beschreiben<br />

und vom Prozessor direkt verarbeitet werden können.<br />

Da diese Zahlen nicht besonders eingängig sind, gibt es für den Programmierer eine<br />

Vereinfachung, sog. Mnemonics“. Dies sind einfach zu merkende, textuelle Befehle, die<br />

”<br />

mit Übersetzungstabellen in die benötigten Zahlenwerte umgesetzt werden können. Die<br />

Übersetzung kann auch mit einem speziellen Programm erfolgen, dieses wird dann Assembler“<br />

”<br />

genannt. Die Rückübersetzung in Mnemonics zur Fehlersuche etc. wird als Disassemblierung“<br />

”<br />

bezeichnet.<br />

Hinweis: Bei den Befehlen ist die Groß/Kleinschreibung nicht wichtig. Die Befehle werden im<br />

folgenden meist groß geschrieben, um sie stärker hervorzuheben.<br />

Grundrechenarten mit dem 80386<br />

Es stehen alle 4 Grundrechenarten und die Bildung des Zweierkomplements zur Verfügung:<br />

Befehl<br />

ADD Ziel, Quelle<br />

SUB Ziel, Quelle<br />

NEG Ziel<br />

MUL Quelle<br />

DIV Quelle<br />

Erläuterung<br />

Ziel := Ziel + Quelle<br />

Ziel := Ziel − Quelle<br />

Ziel := −Ziel (Bildung des Zweierkomplements)<br />

EDX:EAX := EAX*Quelle (vorzeichenlose Multiplikation mit<br />

64Bit-Ergebnis, die niederwertigen 32Bit sind in EAX)<br />

EAX := (EDX:EAX)/Quelle, EDX:=Rest von EAX/Quelle<br />

vorzeichenlose 64Bit-Division mit ganzahligem Ergebnis in<br />

EAX und Rest in EDX<br />

Als Ziel dürfen (zunächst) nur Register angegeben werden (Erweiterung in Übung 2). Quelle<br />

kann ein Register oder auch ein direkter Zahlwert (Konstante, sog. ”<br />

Immediate“) sein. Die<br />

Verarbeitungsbreite (32, 16, 8Bit) wird von den Operandregistern definiert.<br />

MUL und DIV erlauben nur ein Register als Quelle, das Ziel ist immer EAX/AX bzw.<br />

EDX/DX! Die Division erwartet bei einem 16Bit-Register als Divisor einen 32Bit-Wert als<br />

Ausgangswert, für einen 32-Bit-Divisor einen 64Bit-Wert. Dieser setzt sich aus DX bzw. EDX<br />

für die höherwertigen 16 bzw. 32Bit und AX/EAX für die niederwertigen 16/32 Bit zusammen<br />

(Notation DX:AX bzw. EDX:EAX). Eine Division durch 0 führt erst bei der Ausführung zu<br />

einem Fehler (sog. Ausnahme). Diese bricht das Programm normalerweise ab.<br />

Für ADD Ziel,1 bzw. SUB Ziel,1 gibt es aus historischen Gründen noch die Befehle INC Ziel<br />

bzw. DEC Ziel. Diese erhöhen (inkrementieren) bzw. erniedrigen (dekrementieren) das Ziel um<br />

1. Da diese Befehle ausser dem Register keine Operanden brauchen, sind sie kürzer und waren<br />

daher früher schneller in der Ausführung.<br />

10


Beispiele:<br />

ADD EAX,EBX<br />

ADD AX,BX<br />

SUB EBX,10<br />

NEG ECX<br />

MUL ECX<br />

DIV EBX<br />

INC BL<br />

DEC ESI<br />

aber:<br />

ADD AX,BL<br />

ADD AX,EBX<br />

MUL 10<br />

MOV SL,0<br />

EAX := EAX+EBX (32Bit Addition)<br />

AX := AX+BX (16Bit Addition)<br />

EBX := EBX-10<br />

ECX := -ECX<br />

EDX:EAX := EAX*ECX<br />

EAX := (EDX:EAX)/EBX, EDX := Rest (EAX/EBX)<br />

BL := BL+1 (8Bit)<br />

ESI := ESI-1<br />

FALSCH! 8 und 16 Bit können nicht direkt addiert werden!<br />

FALSCH! 16 und 32 Bit können nicht direkt addiert werden!<br />

FALSCH! MUL kann nur Quellregister, keine Konstanten!<br />

FALSCH! SI hat keinen ansprechbaren 8Bit-Teil!<br />

Hinweis: Für vorzeichenbehaftete Multiplikation und Division gibt es spezielle Befehle, die etwas<br />

flexibler in den Parametern sind. Diese werden später behandelt.<br />

Transportbefehl MOV<br />

Um Daten ohne Veränderung zwischen den Registern zu bewegen, existiert der MOV-Befehl<br />

( ”<br />

Move“). Dieser setzt bzw. kopiert je nach angegebenem Register (8, 16 oder 32Bit) einen<br />

Wert in dieses. Kopieren heisst in diesem Zusammenhang, dass das zu kopierende Register<br />

(d.h. die Quelle) nicht verändert wird! Die Bezeichnung Move (verschieben) ist also nicht ganz<br />

korrekt.<br />

Befehl<br />

MOV Ziel, Quelle<br />

Erläuterung<br />

Ziel = Quelle<br />

Ziel kann (vorerst) nur ein Register sein, die Quelle kann zunächst nur ein Register oder auch<br />

eine Konstante sein. Mit einer Konstante kann z.B. der für MUL nötige Register-Multiplikator<br />

geladen werden.<br />

Beispiele:<br />

MOV AX, 10H<br />

MOV EAX, 10H<br />

MOV EBX, EAX<br />

MOV AL,BH<br />

aber:<br />

MOV BL,AX<br />

MOV EAX,BL<br />

MOV BL,300<br />

Lade die 16Bit-Konstante 10 16 nach AX<br />

Lade die 32Bit-Konstante 10 16 nach EAX<br />

Kopiert den Inhalt von EAX nach EBX, EAX wird nicht verändert<br />

Kopiert die oberen acht Bit von BX in die unteren 8 Bit von AX<br />

(die oberen 24Bit von EAX werden nicht verändert)<br />

FALSCH! 16Bit können nicht in 8Bit kopiert werden!<br />

FALSCH! 8Bit können so nicht in 32Bit kopiert werden!<br />

FALSCH! 300 passt nicht mehr in 8Bit!<br />

Angabe symbolischer Konstanten<br />

In manchen Fällen ist es aus Entwicklungsgründen ungünstig, direkt die Zahlkonstanten in die<br />

Befehle zu schreiben. Um dies zu umgehen, ist es in allen Assemblern möglich, symbolische<br />

Namen als Platzhalter anzugeben, die bei der Assemblierung durch einen anderswo definierten<br />

Wert ersetzt werden (Textersetzung). Diese Definitionen erfolgen üblicherweise mit einem<br />

” Pseudo-Befehl“1 , z.B. equ (equals). Die Symbole selbst (also Name mit Doppelpunkt) werden<br />

1<br />

”<br />

Pseudo“ deshalb, weil es kein echter Prozessorbefehl ist, sondern eine Anweisung, die nur der Assembler<br />

versteht.<br />

11


auch als Marken bzw. Labels bezeichnet, sie können auch ohne Pseudobefehle benutzt werden,<br />

um eine bestimmte Position zu markieren (dazu später mehr).<br />

Beispiel:<br />

startwert:<br />

EQU 15<br />

....<br />

MOV EAX,startwert ; Lädt EAX mit ’startwert’, also 15<br />

MOV EBX,startwert+1 ; Lädt EBX mit ’startwert+1’, also 16<br />

Aufgaben<br />

Aufgabe 1.1<br />

Die ETI-Waschmaschine informiert den Benutzer nach dem Start über die geschätzte Gesamtdauer<br />

eines Waschprogramms. Diese berechnet sich aus 3 vom Waschprogramm abhängigen<br />

Zeiten (Vorwäsche VW, Hauptwäsche HW, Schleudern SCH) und einem festen Wert, der das<br />

abschliessende Sicherheitsabpumpen und Auflockern der Wäsche (Trommel kurz hin- und her<br />

bewegen) beinhaltet.<br />

☞ Schreiben Sie ein x86-Assembler-Programm, dass die Gesamtwaschzeit errechnet. Der feste<br />

Wert betrage 50 Sekunden, die Sekundenzeiten für VW, HW und SCH sind bereits in den<br />

16-Bit Registern AX, BX und CX abgelegt, das Rechenergebnis soll in DX stehen. Mehr als 4<br />

Befehle sollten Sie nicht dazu benötigen.<br />

Aufgabe 1.2<br />

Unsere Waschmaschine zeigt dem Benutzer immer die aktuelle Temperatur des Waschwassers<br />

an. Dazu werden die Daten eines Temperatursensors ausgewertet, der vorzeichenlose Werte<br />

zwischen 0 und 255 liefert. Allerdings müssen diese Werte umgerechnet werden, da der Sensorwert<br />

0 einer Temperatur von 100 ◦ C und Sensorwert 255 einer Temperatur von 10 ◦ C entspricht.<br />

Ansonsten arbeitet der Sensor innerhalb dieses Bereichs linear.<br />

☞ Wie muss man allgemein die aktuelle Temperatur aus dem gelieferten Sensorwert berechnen?<br />

☞ Welche Probleme ergeben sich mit der Umrechnungsformel, wenn man nur mit ganzen<br />

Zahlen rechnen kann? Wie kann man diese umgehen?<br />

☞ Wie müsste ein Programmstück in x86-Assembler aussehen, das diese Temperaturberechnung<br />

möglichst fehlerfrei durchführt? Der Sensorwert liege vor Beginn der Rechnung im 8-Bit<br />

Register BL, das Rechenergebnis soll im 32-Bit Register EAX stehen.<br />

☞ Welche Möglichkeiten gibt es noch zur Umrechnung? Welche Vor- bzw. Nachteile haben sie?<br />

Falls Sie noch Fragen haben, wenden Sie sich bitte an Ihre Tutoren oder<br />

Marcel Meyer, E-Mail: meyerm@in.tum.de<br />

12

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!