Übungsblatt 1 - LRR - TUM
Übungsblatt 1 - LRR - TUM
Übungsblatt 1 - LRR - TUM
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