Home
Die Assemblersprache der intel 80x86
Contents
1. NEG Negation Negation Syntax NEG Operand Operand reg8 16 32 mem8 16 32 Flags OJ IS IZ JA P IC Beschreibung Negiert den Operanden im Zweierkomplement d h wechselt dessen Vor zeichen Beispiele MOV AX 5000 NEG AX Inhalt von AX ist jetzt 5000 Increment Decrement INC DEC Inkrement Dekrement Syntax INC DEC Operand Operand reg8 16 32 mem8 16 32 Flags OJ IS IZ A P Beschreibung INC erh ht den Operanden um 1 DEC erniedrigt den Operanden um 1 Beispiele MOV CX 80 11 CALL Unterprog DEC CX Schleifenz hlvariable herabz hlen JNZ 11 bedingter Sprung Addition Addition with Carry ADDIADC Addition Addition mit bertrag Syntax ADD ADC Operandi Operand2 Operand1 reg8 16 32 mem8 16 32 Operand2 reg8 16 32 mem8 16 32 Direktoperand Flags OJ IS IZ JA P IC Beschreibung ADD Operandl wird zu Operand2 addiert das Ergebnis wird in Ope randl abgelegt ADC Operandl und der Inhalt des Carryflags werden zu Operand2 ad diert das Ergebnis wird in Operandl abgelegt Die Befehle arbeiten f r vorzeichenbehaftete und vorzeichenlose Zahlen korrekt Es k nnen nicht beide Operanden Speicheroperanden sein Die Kombination aus ADD und ADC erm glicht die Addition beliebig gro er Zahlen Siehe auch SUB SBB 140 Beispiele KAPITEL 16 ASSEMBLERBEFEHLE NACH GRUPPEN Es soll a b c mit 16 Bit Zahlen berechnet werden MOV
2. CODE MOV AX DS ES DI mu auf Ziel zeigen MOV ES AX MOV DI offset Spruch Source index Quellzeiger CLD DF 0 gt Inkrement MOV AL F STOSB store string byte gt Freizeit Compare String Byte Word Doubleword CMPSB CMPSW CMPSD Vergleichen String Byte Wort Doppelwort Syntax CMPSB CMPSW CMPSD Flags OJ IS IZ JA P IC Beschreibung Vergleicht das Byte Wort Doppelwort an DS SI mit dem an ES DI und setzt die Flags wie bei CMP Beispiele s REPE REPNE Scan String BytelWord Doubleword SCASBISCASWISCASD Suchen String Byte Wort Doppelwort Syntax SCASB SCASW SCASD Flags OJ IS IZ JA P IC Beschreibung Vergleicht das Byte Wort Doppelwort in AL AX EAX mit dem an ES DI und setzt die Flags wie bei CMP Beispiele s REPE REPNE EP Repeat ds Wiederholen Syntax REP Stringbefehl Stringbefehl MOVSISTOS Flags 16 9 STRINGBEFEHLE 151 Beschreibung REP ist kein eigenst ndiger Befehl sondern ein Wiederholungspr fix und mu vor einem Stringbefehl stehen Sinnvoll sind nur MOVS und STOS REP bewirkt da nach jeder Ausf hrung des nachstehenden Stringbefehls CX dekrementiert und falls CX40 der Stringbefehl erneut ausgef hrt wird Auf diese Art l t sich in einer Zeile eine bis zu OFFFFh mal ausgef hrte Z hlschleife programmieren REPNE SCAS CMPS Beis
3. 13 6 1 Inline Assembler in Microsoft Visual C C Programmen 32 Bit 13 6 2 Inline Assembler in Borland C Programmen 16 Bit 13 6 3 Externe Assemblerprogramme in Borland C Programmen 16 Bit 14 Assemblerpraxis 14 1 Der Zeichensatz a a A en RR A AAA 14 1 1 Intormealionselnbelted os s a cocos sa ba aa RA A NC IN G 14 2 Die DOS Kommandozeile zur ck in die Steinzeit 14 3 Assemblieren Linken Debuggen 14 4 Em Rahmenprogramm gt 2 s s sa soia 2 Sauna ae aaa 15 L sungen zu den Testfragen 89 89 90 92 93 95 95 96 96 97 101 101 103 105 105 111 113 118 118 120 120 122 123 125 6 INHALTSVERZEICHNIS 16 Assemblerbefehle nach Gruppen 131 16 1 Allgemeines occi 2 25 4 28 4 22 ad ua aa Ra nn 131 16 1 1 Das Format einer Assembler Zeile 132 16 2 Teansporthefehle oo eao me e a nr a e EEN EN WE a A EN 132 16 3 Losische Befehl i eao 2 eo acea sn a e EE LN AN EN e 134 16 4 Schiebe und Rotatlonsbeiehle oo one neh NEEN 136 16 9 Biozelbit Beichle 2 22 u ua win Re en re de Es 138 16 6 Aritiimetische Befehle ose 2 n seh wa nt ee es 139 16 7 Shgekbetehle aa au sea a nach ai E SE en E EE A 144 16 8 Programmflu Steuerungsbefehle 144 16 9 Strinebefehle o se aa 245 sea taa sua doa an aoea a e eea 148 16 10Ein und Ausgabebefehle Input Output e 152 16 118chleifenbefehle o oc satona maea toaa
4. Ergebnisse Byte Division da bl Divisionsergebnis Divisionsrest Beispiel zu berechnen 823 2 Byte Division da bl Keine da Divisionsfehler und Programmabbruch Grund Ergebnis 410 ist zu grof fiir Register al mov ax 823 mov bx 2 Beispiel zu berechnen 823 2 74 div KAPITEL 8 ARITHMETISCHE BEFEHLE bx Wort Division da bx Ergebnisse 3 3 3 3 meist Divisionsfehler und Programmabbruch Grund Bei der Wortdivision wird DX AX durch den Divisor hier BX geteilt DX wurde aber nicht auf einen definierten Inhalt gesetzt sobald DX gr er als 1 ist ist das Divisionsergebnis gr er als FFFFh und Register AX ist zu klein bei DX 1 erhalten wir ein unerwartetes Ergebnis A Beispiel zu berechnen 823 2 mov mov mov div ax 823 bx 2 dx 0 bx Wort Division da bx Ergebnisse 3 3 ax 411 Divisionsergebnis dx 0 Divisionsrest Ein Divisionfehler kann nur sicher vermieden werden wenn a Die h herwertige H lfte des Dividenden kleiner als der Divisor ist b Abgefragt wird ob der Divisor ungleich Null ist 8 5 Vorzeichenumkehr NEG Mit NEG Negate kann das Vorzeichen einer vorzeichenbehafteten Zahl umgekehrt werden NEG hat einen Operanden dieser kann eine Register oder Speichervariable sein mit 8 16 oder 32 Bit Wie eine Vorzeichenumkehr auf Bitebene ausgef hrt wird ist in Abschnitt 8 1 beschrieben Ein Beispiel f r die Verwendung von NEG ist di
5. 5 3 5 4 eenegen Are ar ange ee AN EN a ENEE a Ausf hrung von Betriebssystemaufrufen in Assembler Einige N tzliche Betriebssystemaufrufe oaa aa a TES TTABED o e saa ga E a A a A A E e a a 6 Bitverarbeitung 6 1 6 2 6 3 6 4 Bitweise logische Befehle 22 2 2 CE Emm nn nn Schiebe und Rotationsbefehle cc lt lt 2a 2 una mas ann nn Einzelbir Berhle ts e AE EE a er E EN TEME A EN a Ea EE AE Ad ao E E e EE a 7 Sprungbefehle Sek 7 2 7 3 7 4 7 5 Unbedingter Sprungbefehl JMP 2 2 Ko En une Bedingte Sprungbefehle 2 2 2 LE En n nn Yerzweigungen und Schleiien 2 aus A ne re Ta E or ae ii A RTE TAS TLoomme Lespnz gt c sri werner sahne Tesibagen o coo e a A A A A IR a a E a 38 38 39 39 41 41 43 44 44 47 48 49 51 5l 53 56 56 58 4 INHALTSVERZEICHNIS 8 Arithmetische Befehle 65 8 1 Die Darstellung von ganzen Zahlen o ccsa o suoi Sa sr man rn rn ne 65 3 2 Addition und Subtraktien x ce ii corsario en 69 83 Multiplikation 2 20 28 4a 2 08 Si aaa aa N ER Ar ie 70 8 3 1 Vorzeichenlose Multiplikation MUL a 70 8 3 2 Vorzeichenbehaftete Multiplikation IMUL 71 Sel Dyson 20 dr A E A A A ka 72 a Verzsicnenurolel NEG aon 4 8 ar aaa A aa 74 BO Beispiel o ccs oea dod Kaea a rr a AA a E re 74 S TEST FABE o coo er ee A A a a De a 75 9 Stack und Stackbefehle
6. e Der Prozessor greift im Stacksegment zu wenn das Basisregister BP ist e Der Prozessor greift in allen anderen F llen im Datensegment zu Zum Laden der beteiligten Register mit dem Offset einer Variablen kann der Operator Offset verwendet werden So ergeben sich dann sehr viele M glichkeiten die Adressierung aufzubauen An einem kleinen Beispiel sei die Vielfalt demonstriert Es soll das Zeichen Nr 5 in einem Feld von Zeichen berschrieben werden DATA Zeichenkette DB ABCDEfGH CODE mov ax data mov ds ax mov zeichenkette 5 F direkte Adressierung mov bx 5 mov zeichenkette bx F indirekte Adressierung mit BX Konst mov bx 5 mov zeichenkette di F indirekte Adressierung mit DI Konst mov bx offset zeichenkette Offset von zeichenkette nach BX mov bx 5 F indirekte Adressierung mit BX Konstante mov bx offset zeichenkette Offset von zeichenkette nach bx mov si 5 mov bx tsi F indirekte Adressierung mit BX SI mov bx offset zeichenkette Offset von zeichenkette nach bx add bx 5 BX um 5 erh hen mov bx F indirekte Adressierung mit bx mov bx offset zeichenkette Offset von zeichenkette nach bx mov si 4 mov bx si 1 F indirekte Adressierung mit BX SI Konst mov si offset zeichenkette t5 0ffset von zeichenkette b nach si mov sil F indirekte Adressierung mit bx Alle Adressierungen in diesem Beispiel adressieren die gleich
7. 1 0 2 i 0 n 2 on ni on ar 1 y ai ol i 0 n 2 an 2T Y a Y 1 Z 1 1 0 Damit ergibt sich also f r die vorzeichenumgekehrte Zahl Z Z Z l 8 3 Als Beispiel betrachten wir die Vorzeichenumkehr von 11d 11110101b nach Invertieren ergibt sich 00001010b und nach dem anschlie enden Inkrementieren 00001011b 11d 8 2 Addition und Subtraktion Die einfachsten arithmetischen Befehle sind INC Increment und DEC Decrement f r die Erh hung und Erniedrigung um eins INC und DEC setzen die f nf Flags OF SF ZF AF und PF Im Unterschied zu ADD und SUB wird also CF nicht gesetzt Beispiele inc cx erh ht cx um 1 dec Feld bx erniedrigt eine Speichervariable um 1 70 KAPITEL 8 ARITHMETISCHE BEFEHLE Mit dem Additionsbefehl ADD kann man zwei Operanden gleicher bitbreite addieren das Ad ditionsergebnis wird im ersten Operanden abgelegt Die Operanden k nnen jeweils 8 16 oder 32 Bit Zahlen in Registern Speichervariablen oder Direktwerten sein Nicht zwei Speicherva riable Der Befehl ADD setzt sechs Flags OF SF ZF AF CF und PF Beispiele add ax bx addiert ax und bx Summe nach ax add c1 6 addiert cl und 6 Summe nach cl add zaehler ax addiert ax zu zaehler Ergebnis in zaehler add ebx dwort addiert dwort zu ebx Ergebnis in ebx Der Befehl ADC Add with Carry addiert zus tzlich als dritten Operanden das Carryflag mit der Wertigkeit des LSB zum Ergebnis Damit
8. 1 1 MASCHINENCODE UND ASSEMBLERSPRACHE 11 Abbildung der Prozessorstruktur und die einzige M glichkeit alle F higkeiten eines Prozessors zu nutzen Jeder Assemblerbefehl erzeugt im Gegensatz zu Hochsprachen auch nur einen Ma schinenbefehl Compiler erzeugen in der Regel direkt Maschinencode manche Compiler k nnen aber optio nal auch Assemblercode erzeugen Maschinencode f r andere Prozessoren erzeugt ein Cross Assembler bzw Cross Compiler Hochsprachenprogramm Compiler Assemblerprogramm Assembler Maschinencode Maschinencode f r anderen Prozessor Cross Compiler Compiler anderer Prozessor Prozessor Wo liegen nun die Vor und Nachteile von Assembler Vorteile sind e Optimale Prozessorausnutzung m glich guter Assemblercode ist sehr performant e Vollst ndige Kontrolle ber die Prozessorhardware e Kompakter Code Nachteile sind e Der Programmierer braucht eine gute Kenntnis des Prozessors e Jeder Prozessor hat seine eigene Assemblersprache Spezialwissen erforderlich e Reduzierte Portabilit t 12 KAPITEL 1 EINF HRUNG e Keine Bibliotheksfunktionen f r Textausgabe Dateioperationen mathematische Funktio nen mathematische Ausdr cke u e Fehler passieren etwas leichter und haben manchmal schwerwiegendere Folgen e gro e Assemblerprogramme werden unhandlich In der Praxis werden heute nur noch wenig Programme zu 100 in Assembler geschrieben Meist schreibt man Programme
9. Die Assemblersprache der intel 80x86 Prozessoren Prof Dr Klaus W st Fachhochschule Gie en Friedberg Fachbereich MNI Studiengang Informatik Gie en im M rz 2003 Inhaltsverzeichnis 1 Einf hrung 1 1 Maschinencode und Assemblersprache 2 o e e 1 2 Register und Flags des 80386 nn nn 1 2 1 1 22 1 2 3 1 2 4 Mikroprozessoren 2 2 22m mn Bis und BIE cooper Die Reihe der intel 80x86 Prozessoren 2 2 2 m mn m m nn 2 Organisation und Benutzung des Hauptspeichers 2 1 Speichervariablen definieren 2 2 16 Bit Umgebungen Der segmentierte Hauptspeicher 2 222 22 2 3 32 Bit Umgebungen Der unsegmentierte Hauptspeicher 24 Adressierungsarten s sa sp a aaoi a au 8 Sea sa aaa Drake 2 4 1 2 4 2 2 4 3 2 4 4 2 4 5 Unmittelbare Adressierung Registeradressierung Direkte Speicheradressierung Die indirekte Speicheradressierung Die indirekte Adressierung beim 180386 2 2 2 n nenn 25 o 1 Wr re a ea 13 13 13 14 16 19 22 INHALTSVERZEICHNIS 3 Daten transportieren 3 1 3 2 3 3 3 4 3 5 Daten gleicher Bitbreite kopieren MOV 2 EL En Daten austauschen SCHO Daten in gr ere Register transportieren Bedingtes Setzen von Registern oder Speicherpl tzen 2 22222200 TR A A ae na rg a a ee ee ge 4 Ein und Ausgabe 5 Betriebssystemaufrufe 5 1 9 2
10. bezeichnet Eine andere Problematik ist dass Standardarithmetik der ALU oft f r die Bearbeitung von Audio und Videodaten unpraktisch ist Die Erh hung des Helligkeitswertes 255 um 1 f hrt in 8 Bit Darstellung durch den Register berlauf zu einem Helligkeitswert 0 der sicher nicht erw nscht ist Ebenso w rde eine Verringerung eines Helligkeitswertes 0 um 1 zu einem Hellig keitswert von 255 f hren was ebenfalls keinen Sinn macht Besser w ren S ttigungsendwerte von 255 und 0 also S ttigung am oberen Endwert 255 1 255 255 2 255 usw S ttigung am unteren Endwert 0 1 0 0 2 0 usw Feste Endwerte statt berlauf und Unterlauf nennt man auch S ttigungsarithmetik Eine weitere f r Multimedia w nschenwerte Eigenschaft ist ein Multiply and Accumulate Befehl MAC Befehl der in der digitalen Signalverarbeitung st ndig gebraucht wird MAC Befehle multiplizieren zwei Zahlen und addieren das Ergebnis zu einer mitgef hrten Summe mehr dazu weiter unten 89 90 KAPITEL 12 DIE MMX EINHEIT 12 2 Register Datenformate und Befehle Die 1997 eingef hrte MMX Einheit der Pentium Prozessoren Multimedia Extension bietet nun genau diese Spezialfeatures SIMD S ttigungsarithmetik und auch einen MAC Befehl Es stehen acht MMX Register mit je 64 Bit Breite zur Verf gung Diese Register k nnen wie folgt Daten austauschen e In 32 Bit Breite mit den Universalregistern und dem Speicher Befehl movd move double word e In 64 Bi
11. mov az data mov da az senkrechter Wurf nach oben h v0 0 5xg t t finit fld t t in st 0 fst st 1 Kopie nach st 1 fmul g st 0 g t fmul einhalb st 0 0 5x gx t fsubr vO st 0 v0 0 5 g t fmulp st 1 st 0 st 1 st 1 st 0 pop fstp Hoehe zurueckschreiben auf Variable Hoehe EXIT mov ah 04Ch ah 04C DOS Funktion terminate the program mov al 0 DOS Return Code int 21h Interrupt 21h Aufruf von DOS END Programmstart Ende Uebersetzung Kapitel 12 Die MMX Einheit 12 1 SIMD S ttigungsarithmetik und MAC Befehle In den 90er Jahren wurde klar dass PC s in immer neue Anwendungsbereiche vordringen und dass dazu auch Bearbeitung und Wiedergabe von Audio und Videodaten geh rt Dazu m ssen meist sehr viele kleine Dateneinheiten verarbeitet werden die in Feldern liegen oder kontinuier lich angeliefert werden So wird ein Lautst rkewert Abtastwert in CD Qualit t durch 2 Byte 16 Bit dargestellt ein Grauwert oft durch 1 Byte ein Farbwert durch 3 Byte Die Prozessor Register mit 32 oder mehr Bit sind also schlecht ausgenutzt Die Registerausnutzung w re mit gepackten Dateneinheiten besser z B ein 32 Bit Register als zwei unabh ngige Worte oder vier unabh ngige Byte zu behandeln Wenn man dann diese unabh ngigen Teildaten gleichzeitig be arbeiten k nnte h tte man nat rlich viel Zeit gewonnen Diese Idee ist schon alt und wird als Single Instruction Multiple Data SIMD
12. 0040106E C7 45 F8 19 00 00 00 mov dword ptr b 19h 22 c Produkt a b Funktionsaufruf 00401075 8B 45 F8 mov eax dword ptr b 00401073 50 push eax 00401079 8B 4D FC mov ecx dword ptr a 0040107C 51 push ecx 0040107D E8 7E FF FF FF call CILT 0 ProduktCOYAHHHOZ 0x00401000 00401082 83 C4 08 add esp 8 00401085 89 45 F4 mov dword ptr c eax 23 printf 6iXn c 00401088 8B 55 F4 mov edx dword ptr c 0040108B 52 push edx 0040108C 68 5C 5A 41 00 push offset ___xt_z 0x00415a5c 138h 00401091 ES 3A 00 00 00 call printf 0x004010d0 00401096 83 C4 08 add esp 8 24 25 f 1 2 Fliesskomma Operationen 00401099 D9 45 FO fld dword ptr f 0040109C D8 35 54 30 41 00 fdiv dword ptr _C0_08GNFCOprintf7 4c7 AAC 0x00413054 4 00401042 D9 5D FO fstp dword ptr f 26 27 return 0 004010A5 33 CO xor eax eax 28 004010A7 8B E5 mov esp ebp 00401049 5D pop ebp 100 KAPITEL 13 DIE SCHNITTSTELLE ZWISCHEN ASSEMBLER UND C C 004010AA C3 ret Ende Quellcodedatei O O O O Zum Verst ndnis dieses Assemblercodes die folgenden Kommentare Sie beziehen sich auf die As semblerbefehle durch die der C Befehl in der genannten Zeile realisiert wird Man sieht sehr deutlich dass es sich um 32 Bit Code handelt Es werden 32 Bit Register benutzt EAX EBX usw Zeiger sind einfache 32 Bit Zahlen Integer sind mit 32 Bit codiert die Register ecx und eax werden f r die Adressierung benutzt nicht m glich beim i8086
13. Bedingte Sprungbefehle werden meistens benutzt um Verzweigungen und Schleifen zu realisie ren sie sind von elementarer Wichtigkeit f r die Assemblerprogrammierung Es gibt aber eine wichtige Einschr nkung f r die bedingten Spr nge Alle bedingten Spr nge k nnen nur Ziele im Bereich von 128 Byte bis 127 Byte erreichen Liegt ein Sprungziel weiter entfernt wird die Assemblierung mit einer Fehlermeldung abgebro chen Beispiel jz ende Sprungziel ende zu weit entfernt Fehlermeldung beim Assemblieren In diesem Fall muss man eine Hilfskonstruktion mit einem unbedingten Sprungbefehl benutzen dieser kann ja beliebige Entfernungen berbr cken jnz hilfsmarke jmp ende Erreicht weit entferntes Sprungziel hilfsmarke 7 3 VERZWEIGUNGEN UND SCHLEIFEN 61 7 3 Verzweigungen und Schleifen Verzweigungen und Wiederholungsschleifen werden in Assemblersprache durch Sprungbefehle realisiert Eine Verzweigung mit zwei Zweigen wird grunds tzlich folgenderma en aufgebaut die Namen der Marken sind nat rlich frei w hlbar cmp Operandi Operand2 jxxx Wahr Zweig Bedingter Sprungbefehl Falsch Zweig wird ausgef hrt wenn Bedingung falsch jmp Verzweigungsende Wahr Zweig Wahr Zweig wird ausgef hrt wenn Bedingung wahr Verzweigungsende Der Wahrzweig kann auch entfallen dann hat man einen bedingt ausgef hrten Befehlsblock Ein Beispiel f r obige Konstruktion ist mov dx pixelnr cmp dx MaxPixelnr Vergleiche
14. Der Befehl PUSH speichert ein Wort auf dem Stack Dabei wird SP um zwei vermindert Der Befehl POP liest ein Wort vom Stack dabei wird SP um zwei vergr ert Der Bereich oberhalb von TOS bis einschlie lich TOS ist der Dateninhalt und gesch tzte Bereich des Stack Der Bereich unterhalb TOS ist ung ltig d h darf frei berschrieben werden s Abb 9 1 Mit den Befehlen PUSH und POP l t sich der Stack einfach als Last In First Out ansprechen Dabei wird die automatische Stackverwaltung durch die Register SS und SP benutzt 77 78 KAPITEL 9 STACK UND STACKBEFEHLE SS SP ung ltig und frei Abbildung 9 1 Aufbau des Stacks Ein PUSH Befehl speichert ein neues Wort und verschiebt damit den TOS nach unten PUSH Der PUSH Befehl speichert ein Wort auf dem Stack ab Dieses wird unterhalb des bisherigen TOS gespeichert und bildet den neuen TOS SP wird dabei um zwei vergr ert der Stack ist also um zwei Byte zu den niedrigen Adressen hin gewachsen POP Der POP Befehl liest das TOS Wort vom Stack und vergr ert SP um zwei Der Stack ist also zwei Byte kleiner geworden es gibt ein neues TOS PUSH und POP haben je einen Operanden der ein 16 Bit Register oder ein 16 Bit Speicherplatz sein kann ab 80286 auch ein Direktwert Wichtig Am Ende eines Programmes oder Unterpro grammes muss der Stackpointer wieder den gleichen Wert haben wie am Anfang Deshalb muss die Anzahl der ausgef hrten PUSH und POP Befehle oder gleichwertige
15. EBP sichern Die gerufene Funktion selbst sichert nun zun chst den aktuellen Inhalt von EBP auf dem Stack PUSH EBP ESP auf EBP kopieren Um den Stack ber EBP bequem adressieren zu k nnen und ESP frei zu haben f r weitere Stackreservierungen z B durch PUSH wird ESP auf EBP kopiert Platz f r lokale Variable reservieren Durch Verkleinerung von ESP oder durch PUSH kann f r ben tigte lokale Variable Platz auf dem Stack reserviert werden Code und Kommentar zu Zeile 3 Freigabe der lokalen Variablen Durch Zur cksetzen des ESP auf den Wert vor der Reser vierung wird vor Beendigung der Funktion der Speicherplatz der lokalen Variablen wieder freigegeben Zeile 7 Der gerettete EBP Inhalt muss jetzt Top of Stack TOS sein EBP wieder herstellen Durch POP EBP erh lt EBP wieder den Wert den er vor dem Funk tionsaufruf hatte Erst dadurch sind geschachtelte Funktionsaufrufe m glich R cksprung TOS ist jetzt die R cksprungadresse die durch RET Return vom Stack genom men wird Parameter vom Stack entfernen Nun m ssen nur noch die bergebenen Parameter vom Stack entfernt werden Dies wird bei standardm iger C Kompilierung durch das rufende Programm ausgef hrt Die Art der Parameter bergabe und entfernung l sst sich durch Compileroptionen steuern s Abschn 13 5 1 Wenn man beispielhaft annimmt dass die Parameter und die lokalen Variablen 4 Byte gro sind hat durch dieses Vorgehen der Stack w hrend der Ausf hrung einer
16. Jump if zero identisch mit JE Jump if equal und erzeugt auch den gleichen Maschi nencode Typisch ist die Kombination eines CMP Befehles mit einem nachfolgenden bedingten Sprungbefehl JXXX Beispiel jc ende Jump if Carry nach ende wird evtl bersprungen ende 60 KAPITEL 7 SPRUNGBEFEHLE Befehl Sprungbedingung Sprungbed dt Flags Direkte Abfrage von Flags JE JZ equallzero gleich Null ZF 1 JNE JNZ not equal zero ungleichlungleich Null ZF 0 JS signed Vorzeichen negativ SF 1 JNS not signed Vorzeichen positiv SF 0 JP JPE parity parity even gerade Parit t PF 1 JNP JPO no parity parity odd ungerade Parit t PF 0 JO overflow berlauf OF 1 JNO no overflow kein berlauf OF 0 JC carry bertrag CF 1 JNC no carry kein bertrag CF 0 Arithmetik mit Vorzeichen JLIJNGE less not greater or equal kleiner CF 4 OF JLEJJNG less or equallnot greater kleiner oder gleich SF 4 OF oder ZF 1 JNL JGE not less greater or equal nicht kleiner SF OF JGIJNLE greater not less or equal gr er SF OF und ZF 0 Vorzeichenlose Arithmetik JAJJNBE abovelnot below or equal oberhalb CF 0 und ZF 0 JB IJNAE below not above or eq unterhalb CF 1 JNA JBE not above below or equal nicht oberhalb CF 1 oder ZF 1 JNB JAE not below above or equal nicht unterhalb CF 0 Tabelle 7 1 Bedingte Sprungbefehle Schleifenanfang cmp cx 10 jb Schleifenanfang Springe nach Schleifenanfang wenn cx lt 10
17. chst folgende Variable Dwordvar den Offset 3 Stringvar den Off set 7 In vielen F llen z B bei Aufruf der DOS Funktion 9 Stringausgabe ist es notwendig in einem Register den Offset einer Variablen zu bergeben Man berl sst dem Assembler das Abz hlen indem man den Operator Offset benutzt F r obige Datendefinition z B mov ah 9 DOS Funktion Stringausgabe mov dx Offset Stringvar besser als mov dx offset 7 Offset der Stringvariablen nach DX int 21h Systemaufruf und Ausgabe Einige Beispiele zur Benutzung des Hauptspeichers DATA Zaehleri DB Zaehler2 DB O Endechar DB 2 2 16 BIT UMGEBUNGEN DER SEGMENTIERTE HAUPTSPEICHER 25 Startchar DB A Pixelx DW Pixely DW 01FFh Schluessel DD 1200h CODE mov Zaehler1 O Direktwert auf Speichervariable schreiben mov Zaehler2 al 8 Bit Registerwert auf Speichervariable kopieren mov ah 2 mov dl Startchar 8 Bit Speichervariable lesen und in Register kopieren int 21h mov Endechar H Direktwert als Character angeben und auf Speichervar schr xchg cx Pixely 16 Bit Speichervariable mit Registerinhalt austauschen mov schluessel eax 32 Bit Register auf Speichervariable kopieren movzx edi Pixelx 16 Bit Speichervariable in 32 Bit Register kopieren h herwertiges Wort des Registers dabei auf Null setzen Weitere Beispiele dazu in Abschn 2 4 3 2 2 16 Bit Umgebungen Der segmentierte Hauptspeicher Der Intel8086 hat einen Adressbus aus 2
18. xor 52 135 Zeichensatz 65 Zeiger 27 Zweierkomplement 66 INDEX
19. 256 DUP 0 CODE Programmstart mov ax 0Cdata mov ds ax Laufzeitadresse des Datensgments nach DS mov di offset zeichenkette indirekte Adressierung vorbereiten wegen SMALL Verw von NEAR Zeigern Zeichenholen mov bl di indirekte Adressierung der Zeichenkette mit DI ein Zeichen aus der Kette nach bl laden mov bh 0 indirekte Adressierung mit BX vorbreiten inc Haeufigkeit bx Adresse wird zusammengesetzt aus Startadresse Haeufigkeit und dem Inhalt des Registers BX Beispiel Das gelesene Zeichen war ein Ai Code 65 Bx enth lt jetzt den Wert 65 und es wird der Speicherplatz Haeufigkeit 65 indirekt adressiert inc di Zeiger auf n chstes Zeichen weiterruecken cmp b1 0 Ende der Zeichenkette Begrenzungszeichen ist 0 jne Zeichenholen Wenn Zeichen nicht gleich O n chstes Zeichen einlesen 2 5 TESTFRAGEN 35 mov ah 04Ch int 21h Programm beenden END Programmstart Ende der bersetzung 2 4 5 Die indirekte Adressierung beim i80386 Ab dem 80386 kann zus tzlich jedes der acht 32 Bit Allzweckregister als Basisregister dienen und au er dem ESP Register auch jedes als Indexregister Beispiele mov eax ecx 10 edx inc dword ptr edx Man hat also nun fast unbegrenzte Freiheit bei der Adressierung wenn man die 32 Bit Register benutzt Eine Adressierung mit z B cx ist nach wie vor nicht m glich Ausserdem ist zu be achten dass damit ein 32 Bit Offset bergeben wird der nur in einem 32 Bit S
20. 5 Testfragen 1 Entdecken Sie im folgenden Codeabschnitt die fehlerhaften Befehle 1 mov al 50h 2 mov al 100h 3 mov 22 bh 4 mov cx 700000 5 mov cx 70000 6 mov bx 10001111000000b 7 mov eax 177FFAOO1h 8 mov edx 02A4h 9 xchg cx 10h 10 mov eax 1 11 mov eax edi 12 mov ah bl 13 mov bx bl 14 xchg eax bp 15 xchg dx dx 16 mov dl di 17 mov bp bh 18 xchg edi dl 19 mov esi dx 20 xchg esi ebx 21 xchg ch cx 22 mov ch cl 2 Bestimmen Sie den Inhalt des Registers EAX nach der folgenden Befehlssequenz mov bx 7856h xchg bl bh mov ax 3412h xchg al ab shl eax 16 Inhalt von eax um 16 Bit nach links schieben 42 KAPITEL 3 DATEN TRANSPORTIEREN rechts werden Null Bits nachgezogen mov ax bx 3 Vereinfachen Sie den folgenden Codeabschnitt 1 mov al 0 mov ah 1 3 mov ebx 0 4 mov bx 2800h 5 mov eax 0 6 mov al dl 7 xchg ax ax 8 mov ax si 9 mov si di 10 mov di ax 4 Es soll folgende Aufgabe ein Ringtausch bew ltigt werden Inhalt von AX nach BX bringen Inhalt von BX nach CX bringen Inhalt von CX nach AX bringen Dabei sollen nat rlich keine Daten verloren gehen Schreiben sie Befehlssequenzen um die Aufgabe zu l sen a mit mov Befehlen und b k rzer Wie 5 Schreiben sie jeweils eine Befehlssequenz um folgendes zu bewirken a h herwertiges Wort von EAX nach DI bringen und niederwertiges Wort von EAX nach SI bringen b CX ins niederwertige Wort von
21. 63 153 LSB 13 120 MAC Befehl 93 Maschinenbefehle 8 Maschinencode 9 Maschinenwort 120 Mikroprozessor 8 Mnemonic 10 Most significant Bit 13 159 most significant bit 120 mov 132 movsb 148 movsd 148 movsw 148 MOVSX 40 movsx 133 MOVZX 40 movzx 133 MSB 13 120 mul 141 NEAR Pointer 27 NEAR Zeiger 27 neg 139 Nibble 13 120 not 134 Objektdatei 20 Offset 24 25 or 135 OUT 43 out 43 152 Output 43 Paragraph 26 Parameter 81 physikalische Adresse 25 Pointer 27 pop 144 Procedures 81 Protected Mode 16 push 144 rel 137 rer 137 Register 8 Register indirekte Adressierung 31 rep 150 repe 151 repne 151 ret 147 rol 137 ror 137 Rotation 53 S ttigungsarithmetik 89 sal 136 sar 136 160 sbb 140 scasb 150 scasd 150 scasw 150 Schieben 53 Schleifen 61 Segment 25 26 Segment Override 27 segmentierten Speicher 29 setcc 134 shl 136 shr 136 signed binary number 66 SIMD 89 Single Instruction Multiple Data 89 Speichermodelle 27 Sprung 9 Stack 15 20 stack 77 Stackframe 97 Stapel 77 stc 155 std 154 Steuerzeichen 118 sti 154 stosb 149 stosd 149 stosw 149 Stringbefehle 18 sub 140 Subroutines 81 test 52 135 Tetrade 13 120 Typoperator 33 unsigned binary number 66 Verzweigungen 61 Vorbelegung 22 Vorzeichenbit 67 vorzeichenlose Bin rzahl 66 Wort 13 120 xchg 133
22. 77 El BAT egaa a ae at a 77 2 alsek uberisul ne a da a Br ee u EN 78 9 3 Anwendungsbeispiele o 78 GA Testlragen oc e a2 aa an a a a a i a 79 10 Unterprogramme 81 11 Die Gleitkommaeinheit 84 11 1 or ri A E AN 84 11 2 Aufbau der Gleitkommaeinheit o nn 84 11 2 1 Die Register der Gleitkommaeinheit 2 2 2 2 nn n nenn 84 115 Beichlasstz 3 a sn a a ANN a a ee a CH 85 11 3 1 Datentransporibelehle i o 2 2 crea Se a sehr hs 85 11 32 Kontrollbefehle 2 ooo 2 au 24 284 aaa e ad a G 86 11 3 3 Arithmetische Befehle 2 2 2 2 om on o o e 86 11 3 4 Trigonometrische Befehle mn nn 87 11 3 5 Vergleichsbefehle sa 22 24 20 Seas AR 87 INHALTSVERZEICHNIS 12 Die MMX Einheit 12 1 SIMD S ttigungsarithmetik und MAC Befehle o 12 2 Register Datenformate und Befehl 12 3 Der PMADDWD Befehl Unterst tzung der digitalen Signalverarbeitung 12 4 Beiehleubersicht sounds A a ee ir da rn 13 Die Schnittstelle zwischen Assembler und C C a AI Eee ee At a N Sr er a 13 2 16 32 Bit Umgebiumgen o ua 0 u 0 uam nn a a tri a nn a nk 13 3 Aufbau und Funktion des Stack o e e 13 4 Erzeugung von Assemblercode durch Compiler o 13 3 Steuerung der Kompilierung ENEE nr nn 135 1 Aufrufkonventionen lt s sose asa sa EE Erna 12 9 2 bt A E E 13 6 Einbindung von Assemblercode in C C Programme o o
23. 8B EC mov ebp esp 00401023 51 push ecx 4 int Ergebnis 5 Ergebnis Faktor1 Faktor2 00401024 8B 45 08 mov eax dword ptr Faktor1 00401027 OF AF 45 0C imul eax dword ptr Faktor2 0040102B 89 45 FC mov dword ptr Ergebnis eax 6 return Ergebnis 0040102E 8B 45 FC mov eax dword ptr Ergebnis 7 00401031 8B E5 mov esp ebp 00401033 5D pop ebp 00401034 C3 ret 8 9 10 main 00401035 55 push ebp 13 4 ERZEUGUNG VON ASSEMBLERCODE DURCH COMPILER 99 00401036 8B EC mov ebp esp 00401038 83 EC 18 sub esp 18h 11 int a b c 12 int p1 p2 13 float f 15 0 0040103B C7 45 FO 00 00 70 41 mov dword ptr f 41700000h 14 15 Benutzung von Zeigern 16 pi ba pi erh lt die Adresse von a 00401042 8D 45 FC lea eax dword ptr a 00401045 89 45 EC mov dword ptr p1 eax 17 p1 100 a 100 00401048 8B 4D EC mov ecx dword ptr p1 0040104B C7 01 64 00 00 00 mov dword ptr ecx 64h 18 p2 pl p2 enth lt die gleiche Adresse wie pl 00401051 8B 55 EC mov edx dword ptr p1 00401054 89 55 E8 mov dword ptr p2 edx 19 printf p2 zeigt auf die Variable a i p2 i n a p2 00401057 8B 45 E8 mov eax dword ptr p2 0040105A 8B 08 mov ecx dword ptr eax 0040105C 51 push ecx 0040105D 8B 55 FC mov edx dword ptr a 00401060 52 push edx 00401061 68 30 5A 41 00 push offset ___xt_z 0x00415a30 10Ch 00401066 ES 65 00 00 00 Call printf 0x004010d0 0040106B 83 C4 0C add esp 0Ch 20 21 b 25
24. A Zugriff mit FAR Zeiger pop ds DS Register restaurieren Die hier beschriebene Speicherorganisation bezeichnet man auch als segmentierten Speicher Beim Arbeiten unter DOS hat man es immer mit dem segmentierten Speicher und mit FAR Zeigern zu tun Der segmentierte Speicher mit seinen NEAR und FAR Adressen sowie den unterschiedlichen Speichermodellen wurde bald als hinderlich empfunden 2 3 32 Bit Umgebungen Der unsegmentierte Hauptspeicher Mit der Einf hrung des i80386 standen 32 Bit Register zur Verf gung Mit einem 32 Bit Zeiger kann man 2 4GB Speicher adressieren Dies bersteigt bislang immer den in einem PC tats chlich installierten Hauptspeicher also kann jede beliebige Hauptspeicheradresse in ei nem Register gespeichert werden Segmente NEAR und FAR Adressen sowie Speichermodelle geh ren der Vergangenheit an jede Adresse wird durch einen einzigen 32 Bit Wert beschrieben den 32 Bit Offset Anders ausgedr ckt der ganze Speicher stellt ein einziges gro es Segment dar man hat ein sog flaches Speichermodell In einer 32 Bit Umgebung k nnen leicht Da tenstrukturen verwaltet werden die gr er als 64 kB sind Im folgenden Beispiel wird ein Feld von 100000 Byte mit FFh beschrieben mov ebx 0 Zeiger initialisieren 11 mov ebx OFFFFFFFFh 4 Byte in Feld schreiben add ebx 4 Zeiger weiterr cken cmp ebx 100000 Schleifenende jbe 11 2 4 Adressierungsarten 2 4 1 Unmittelbare Adressierung Bei der
25. AX b AX zb ADD AX c AX btc MOV a AX a btc DATA dvari dd doubleword 32 Bit dvar2 dd ve CODE MOV AX word ptr dvari low word von dvari nach AX ADD word ptr dvar2 AX zu low word von dvar2 addieren MOV AX word ptr dvar1 2 high word von dvari nach AX ADC word ptr dvar2 2 AX zu high word von dvar2 addieren dabei bertrag Carry addieren SUB SBB Subtraction Subtraction with Borrow Subtraktion mit Borgen Syntax Flags Beschreibung Beispiele SUB SBB Operand1 Operand2 Operandl reg8 16 32 mem8 16 32 Operand2 reg8 16 32 mem8 16 32 Direktoperand O S Z A P C SUB Operand2 wird von Operandl subtrahiert das Ergebnis wird in Operand1 abgelegt SBB Operand2 und der Inhalt des Carryflags werden von Operand1 subtrahiert das Ergebnis wird in Operand1 abgelegt Die Befehle arbeiten f r vorzeichenbehaftete und vorzeichenlose Zahlen korrekt Es k nnen nicht beide Operanden Speicheroperanden sein Die Kombination aus SUB und SBB erm glicht die Subtraktion beliebig gro er Zahlen Siehe auch ADD ADC Es soll a b c mit 16 Bit Zahlen berechnet werden MOV AX b AX b SUB AX c AX b c MOV a AX a b c DATA dvari dd doubleword 32 Bit dvar2 dd SC S CODE 32 Bit Subtraktion MOV AX word ptr dvari low Word von dvari nach AX SUB word ptr dvar2 AX von low Word von dvar2 subtr
26. Beispiel Durch 41 1 Aa 2 A3 1 B 1 937 Ba 0 9400 wird ein IIR Filter hier ein Tschebischeff Tiefpass Filter zweiter Ordnung dargestellt Diese Koeffizientens tze k nnen recht lang sein besonders bei FIR Filtern 50 Koeffizienten sind nicht ungew hnlich Wird das signalverarbeitende System mit einem Mikroprozessor realisiert 12 4 BEFEHLS BERSICHT 93 so muss obige Rechenvorschrift in ein Programm umgesetzt werden Bei einem digitalen System mit 50 Koeffizienten muss dazu 50 mal das Produkt Amz n m gebildet und zu der Zwischen summe addiert werden um die Summe und damit einen einzigen Ausgangswert zu errechnen Der Rechenaufwand ist also hoch und muss noch dazu in Echtzeit bew ltigt werden um nicht den Anschluss an den Datenstrom zu verlieren Hier hilft ein Befehl der eine Multiplikation und Addition des Ergebnisses in einem Schritt ausf hrt ein sog MAC Befehl Multiply and accumulate Der Befehl PMADDWD der MMX Einheit f hrt sogar zwei zweifache MAC Operationen in einem Schritt parallel aus Er arbeitet nach folgendem Schema Auch hierzu ein Programmbeispiel 63 x3 y3 x2 y2 x1 y1 x0 y0 Zieloperand Quelloperand2 o 63 Abbildung 12 4 Der PMADDWD Befehl multipliziert vier Paare von Worten und addiert paar weise die Produkte auf er ist ein zweifach paralleler MAC Befehl das allerdings der Einfachheit halber nur die untere H lfte der Register ausnutzt also nur einen MAC Befe
27. C PROGRAMME 113 printf k i n k asm dec word ptr k Angabe der Datenbreite notwendig printf k i n k Zugriff auf Felder printf s n puffer Vor Bearbeitung asm lea bx puffer LEA Load Effective Adress laed die Adresse von puffer asm mov byte ptr bx 3 g Ind Adressierung Zugriff auf Position 3 erstes Zeichen liegt an Pos 0 1 Textfehler printf s n puffer Benutzung von Zeigern P puffer asm mov bx P asm sub byte ptr bx t16 a A dereferenzieren durch indirekte Adressierung von puffer Umwandlung in Grossbuchstaben 2 Textfehler printf s n puffer Arbeiten mit Zeigern auf Zeiger P puffer PP 8P PP enthaelt Zeiger auf Zeiger auf puffer asm mov bx PP asm mov si bx dereferenzieren Zeiger auf puffer nach SI asm mov cl byte ptr sil nochmal dereferenzieren Zugriff auf puffer erstes Zeichen lesen asm mov byte ptr ci cl printf c1 cXn c1 Arbeiten mit far pointern FP puffer asm push ds Inhalt von DS aufbewahren asm lds si FP LDS SI Load Pointer to DS and SI laedt die Adresse von puffer nach DS SI asm lodsb asm mov c2 al asm pop ds printf c2 c n c2 getch return 0 13 6 3 Externe Assemblerprogramme in Borland C Programmen 16 Bit Der folgende Abschnitt beschreibt die Verh ltnisse f r den 16 Bit C Compiler von Borland und den Turbo Assembler 114 KA
28. C Beschreibung IMUL mit einem Operanden f hrt eine Multiplikation vorzeichenbehafte ter Zahlen durch und arbeitet ansonsten wie MUL Syntax IMUL Operand1 Operand2 Operand1 reg16 32 Operand2 reg16 32 mem16 32 Direktoperand Flags O C Beschreibung IMUL mit zwei Operanden f hrt eine vorzeichenrichtige Multiplikation der beiden Operanden durch und legt das Ergebnis im ersten Operanden ab Syntax CMP Operandi Operand2 Operand3 Operandl reg16 32 Operand2 reg16 32 mem16 32 Operand3 Direktoperand Beschreibung IMUL mit drei Operanden f hrt eine vorzeichenrichtige Multiplikation des zweiten und dritten Operanden durch und legt das Ergebnis im ersten Operanden ab 16 6 ARITHMETISCHE BEFEHLE 143 Beispiele Multiplikation zweier 8 Bit Speicheroperanden DATA zahli dw 1200 zahl2 dd 3000 CODE IMUL ECX DIV IDIV Unsigned divide signed Integer div Dividieren vorzeichenrichtiges Div Syntax Flags Beschreibung Beispiele DIV IDIV Divisor Divisor reg8 16 32 mem8 16 32 DIV fiihrt eine Division vorzeichenloser und IDIV eine Division vorzei chenbehafteter Zahlen durch Im Befehl wird nur der Divisor explizit als Operand aufgef hrt der Dividend ist immer AX bzw DX AX Je nach Bitbreite des Divisors wird eine Byte oder eine Wort Division durch gef hrt Dabei wird jeweils der ganzzahlige Quotient und der Rest se parat abgelegt Bei der Byte Division ist der Dividend AX Der ganzzahlige Teil des
29. Carry angezeigt Auch dazu ein Beispiel 11100101b 1 27 1 26 1 2 1 24 0 2 1 22 0 21 1 2 128 64 32 4 1 27d Nat rlich ist auch hier der darstellbare Zahlenbereich begrenzt und zwar auf 2971 4928 11 8 Bit Zahlen im Zweierkomplement k nnen beispielsweise den Zahlenbereich 128 127 dar stellen Das h chstwertige Bit ist bei negativen Zahlen gesetzt 1 und bei nichnegativen zahlen nicht gesetzt 0 man bezeichnet es daher auch als Vorzeichenbit Die Zweierkomplement zahlen haben die angenehme Eigenschaft dass die positiven Zahlen nahtlos an die negativen Zahlen anschlie en Nehmen wir als Beispiel wieder die 8 Bit Zahlen im Zweierkomplement und betrachten folgenden Ausschnitt aus dem Zahlenbereich Bitmuster Wert dezimal 11111101 3 11111110 2 11111111 1 00000000 0 00000001 1 00000010 2 00000011 3 Tabelle 8 2 Der Anschluss der positiven an die negativen Zahlen im Zweierkomplement am Beispiel der 8 Bit Zahlen 1 1 f hrt zu dem richtigen Ergebnis 0 Man sieht dass man mit den ganz normalen Additions und Subtraktionsbefehlen problem los von den positiven zu den negativen Zahlen gelangen kann wenn man das bertragsflag Carry ignoriert und genau so arbeitet ein Mikroprozessor Bei der Arbeit mit den Zweier komplementzahlen lauert allerdings eine andere Gefahr Ein bertrag auf das Vorzeichenbit der sog berlauf ndert n mlich das Vorzeichen der Zahl Dies passiert allerding
30. Di visionsergebnis wird in AL und der Rest in AH abgelegt Bei der Wort Division ist der Dividend DX AX Der ganzzahlige Teil des Divisionsergebnis wird in AX und der Rest in DX abgelegt Wenn dasldie Zielregister nicht ausreicht um das Ergebnis aufzunehmen bei kleinen Divisoren tritt der sog Divisionsfehler ein In diesem Fall wird INT 0 ausgel st Ein Spezialfall des Divisionsfehler ist die Divi sion durch Null Siehe auch MUL IMUL Bsp 1 Division eines Doppelwortes DATA Dividend dd 010017h 65559d Divisor dw 10h 16d CODE MOV AX word ptr Dividend niederwertiger Teil in AX MOV DX word ptr Dividend 2 h herwertiger Teil in DX DIV word ptr Divisor Division durch 10h gt ganzzahliger Teil des Quotienten AX 1001h 4097d H H gt Divisionsrest DX 7 Bsp 2 Division durch eine negative Zahl mov ax 50 mov bl 3 idiv bl gt Divisonsergebnis in AL AL FOh 16 im Zweierkomplement H gt Divisionsrest in AH AH 2 multipliziert EAX mit ECX Ergebnis in EDX EAX IMUL DI zahli DI 144 KAPITEL 16 ASSEMBLERBEFEHLE NACH GRUPPEN 16 7 Stackbefehle PUSH a schieben Syntax PUSH Quelle Quelle reg16 32 mem16 32 Flags Beschreibung Kopiert den Quelloperanden an die Spitze des Stack Dazu wird zun chst Beispiele s POP SP um 2 bzw 4 dekrementiert und dann der Kopiervorgang nach SS SP ausgef hrt Weitere Erl uterungen s
31. Funktion folgenden Aufbau der auch als sog Stackframe bekannt ist Ein Stackframe in einem 16 Bit Programm ist in Abschnitt 13 6 3 gezeigt Adresse Inhalt EBP 20 EBP 16 EBP 12 zweites Parameterwort EBP 8 erstes Parameterwort EBP 4 R cksprungadresse EBP geretteter EBP EBP 4 erstes Wort der lokalen Variablen EBP 8 zweites Wort der lokalen Variablen EBP 12 drittes Wort der lokalen Variablen EBP 16 EBP 20 13 4 Erzeugung von Assemblercode durch Compiler Das folgende Beispiel zeigt ein C Programm das mit einem 32 Bit Compiler bersetzt wurde Zun chst der C Quellcode 98 KAPITEL 13 DIE SCHNITTSTELLE ZWISCHEN ASSEMBLER UND C C tinclude lt stdio h gt int Produkt int Faktori int Faktor2 4 int Ergebnis Ergebnis Faktori Faktor2 return Ergebnis main char ch int a b c int p1 p2 float f 15 0 Benutzung von Zeigern pi amp a p1 erh lt die Adresse von a p1 100 a 100 p2 pl p2 enth lt die gleiche Adresse wie pl printf p2 zeigt auf die Variable a i p2 i n a p2 b 25 c Produkt a b Funktionsaufruf printf 6i n c f f 2 Fliesskomma Operationen return 0 Der Compiler erzeugt aus diesem Quellcode folgenden Assemblercode C ASM inlasm codebsp1 cpp O 1 include lt stdio h gt 2 3 int Produkt int Faktor1 int Faktor2 4 00401020 55 push ebp 00401021
32. Holt zun chst eine Adresse vom Stack POP und setzt die Pro grammausf hrung dort fort Verwendung R ckkehr aus einem Unter programm RETN holt ein Wort vom Stack und f hrt einen Near Sprung aus RETF holt zwei Worte vom Stack und f hrt einen Far Sprung aus Bei RET entscheidet der Assembler ber die Art des R cksprungs Optional kann jede der drei Befehlsformen mit einer vorzeichenlosen Zahl als Argument versehen werden Diese Zahl wird zu SP addiert nachdem die R cksprungadresse vom Stack geholt wurde Siehe auch CALL Kopfzeile db Programm XY Version 0 9 13 10 CODE CALL Printkopfzeile Unterprogrammaufruf MOV AH 22 H Proc Printkopfzeile MOV ah 9 DOS Funktion print string MOV dx OFFSET Kopfzeile Adresse von Kopfzeile INT 21h Zeile ausgeben RET ENDP R cksprung Fortsetz bei MOV AH 22 Ende des Codes der Prozedur INT Interrupt Systemaufruf Syntax InT N N Nummer des Aufgerufenen Interrupthandlers 148 KAPITEL 16 ASSEMBLERBEFEHLE NACH GRUPPEN Flags Beschreibung Ruft die zugeh rige BIOS Funktion auf und stellt so die Schnittstelle zum Betriebssystem dar Erlaubte Nummern sind 0 255 Die weitere Spezifikation der gew nschten Funktion wird durch bergabe von Para metern in den Registern AH AL etc vorgenommen Die gr te Gruppe ist INT 21h DOS Funktionsaufruf Beispiele Kopfzeile DB Ballo Asse
33. Multiplikand Ergebnis Bytemultiplikation 8 Bit 8 Bit 16 Bit Wortmultiplikation 16 Bit 16 Bit 32 Bit Doppelwortmultiplikation 32 Bit 32 Bit 64 Bit 8 3 MULTIPLIKATION 71 Byte Multiplikation Syntax MUL reg8 mem8 Der genannte Operand wird mit Register AL multipliziert das Ergebnis hat 16 Bit und wird in AX abgelegt Beispiel mul bl multipliziert bl mit al Ergebnis in ax Wort Multiplikation Syntax MUL reg16 mem16 Der genannte Operand wird mit Register AX multipliziert das Ergebnis umfasst 32 Bit und wird in DX AX abgelegt welche dabei zu einem 32 Bit Register zusammengeschaltet werden High Word in DX Beispiel mul word ptr di multipliziert 16 Bit Speichervar mit ax Doppelwort Multiplikation ab 386 Syntax MUL reg32 mem32 Der genannte Operand wird mit Register EAX multipliziert das Ergebnis umfasst 32 Bit und wird in EDX EAX abgelegt Beispiel mul ecx multipliziert ecx mit eax Ergebnis in edx eax Der MUL Befehl setzt zwei FLags Es gilt OF CF 0 wenn die obere H lfte der Ergebnisbits Null ist CF OF 1 sonst Auf Grund der doppelt so breiten Ergebnisregister kann ein Fehler nicht passieren 8 3 2 Vorzeichenbehaftete Multiplikation IMUL Der IMUL Befehl war beim i8086 formal und syntaktisch das genaue Gegenst ck zum MUL Befehl d h er arbeitete mit einem Operanden wie im vorigen Abschnitt beschrieben Sp ter 286 386 wurden f r den IMUL Befehl viele Varianten erg nzt so dass
34. POP POP SE Syntax POP Ziel Ziel reg16 32 mem16 82 Flags Beschreibung Kopiert den Wert an der Spitze des Stack in den Zieloperanden An schlie end wird SP um 2 bzw 4 erh ht POP wird benutzt um Werte vom Stack zur ckzuholen die mit PUSH dort abgelegt wurden Die Hauptan wendung ist das Zwischenspeichern Retten von Registerinhalten Die Befehle PUSH und POP treten daher in der Regel paarweise auf es wird dann SP automatisch korrekt verwaltet Auf Speicheroperanden werden PUSH und POP seltener angewandt Beispiele PUSH AX AX retten BX retten PUSH BX POP BX POP AX PUSH DS arbeiten mit AX und BX BX restaurieren AX restaurieren Datentransport mit PUSH und POP POP ES 16 8 Programmflu Steuerungsbefehle JMP Jump Springen 16 8 PROGRAMMFLUSS STEUERUNGSBEFEHLE 145 Syntax Flags Beschreibung Beispiele Label1 JMP Ziel Ziel Sprunglabel regl6 mem16 F hrt einen unbedingten Sprung zum angegebenen Sprunglabel Marke durch JMP Labeli unbedingter Sprung wird bersprungen MOV AX OFFh JXXX Jump conditional Springen wenn Syntax JXXX Ziel Ziel label short Label im Bereich 128 bis 127 Byte Flags Beschreibung Beispiele F hrt einen bedingten Sprung zum angegebenen Sprunglabel Marke durch die Sprungweite ist abh ngig von den Segmentattributen und kann z B auf 128 bis 127 Byte begrenzt Short J
35. S SI offset titel MOV DI offset string MOV CL 32 CLD S MOVSB S DEC CL S JNZ L1 MOV AH 9 MOV DX OFFSET string INT 21h 5 Ti MOVS bvari bvar2 S 149 DB Beispiele zum Assemblerskript 0dh O0ah Quelle und Ziel liegen im gleichen Segment Source index Quellzeiger Destination index Zielzeiger Anzahl DF 0 gt Inkrement move string byte Dekrement Zaehler Schleife wenn cl 0 DOS print string function Adresse von string Veberschrift ausgeben irrefuehrend BVAR1 und BVAR2 sind nicht Ziel und Quelle LODSB LODSW LODSD Load String Byte Word Doubleword Laden String Byte Wort Doppelwort Syntax LODSB LODSW LODSD Flags Beschreibung AL AX EAX Beispiele DATA titel H MOV SI offset titel LODSB LODSW LODSD Kopiert ein Byte Wort Doppelwort von DS SI nach DB Beispiele zum Assemblerskript Odh 0ah CODE Source index Quellzeiger titel liegt im Datensegment DS SI zeigt jetzt auf titel CLD A LODSB 3 DF 0 gt Inkrement load string byte gt AL B STOSB STOSWI STOSD Store String Byte Word Doubleword Speichern String BytelWort Doppelwort Syntax STOSB STOSW STOSD Flags 150 KAPITEL 16 ASSEMBLERBEFEHLE NACH GRUPPEN Beschreibung Speichert das Byte Wort Doppelwort in AL AX nach ES DI Beispiele DATA Spruch DB Dreizeitbesch ftigung Odh 0ah
36. Wir wollen hier vom intel 80386 i386 ausgehen der aus der Sicht eines Anwendungsprogram mierers schon nahezu die gleichen Register und Flags bietet wie die Pentium Prozessoren In 1 2 REGISTER UND FLAGS DES 80386 15 Abb 1 2 3 sind die Register des i80386 gezeigt Acht Registernamen beginnen mit einem E f r extended weil diese Register von 16 auf 32 Bit erweitert wurden F r diese acht Register gilt dass jeweils die unteren 16 Bit unter dem Namen des fr heren 16 Bit Registers separat ange sprochen werden k nnen Also ist DI identisch mit den unteren 16 Bit von EDI ebenso SI von ESI SP von ESP und BP von EBP Bei den vier Allzweckregistern EAX EBX ECX und EDX lassen sich die unteren 16 Bit als AX BX CX und DX ansprechen und diese zus tzlich auch byteweise als AL und AH BL und BH CL und CH DL und DH Extended Akkumulator Hauptrechenregister Extended Basisregister bei ind Address Extended Count Z hlen em Elan Do Ext Double Arithmetik mit 64 Bit Zahlen Ext Destination Index Felder adr Stringbef Ext Source Index Felder adr Stringbef Ext Stack Pointer Stackverwaltung des Proz Ext Base Pointer Stackadressierung 15 0 cs O code Segment gt ee Daten Segment SS Stacksegment ES C Extra Segment Selektoren S ees Extra Segment ees Extra Segment EIP Extended Instruction Pointer PC Programmiluss EFlags l Ext FlagsProzessorstatuswort en Abbildung 1 3 Die Regi
37. Zeile 3 Aufbau des Stackframes mit ebp und esp als 32 Bit Zeigerregister Reservierung von 32 Bit f r die lokale Variable Ergebnis durch push ecx Zeile 4 5 Multiplikation von Faktorl und Faktor2 Resultat in Ergebnis abspeichern Faktorl Faktor2 und Ergebnis sind vom Typ Integer und werden als 32 Bit Variablen auf dem Stack angelegt Zeile 6 R ckgabe des Ergebnisses in EAX Zeile 7 Durch H w rd die Funktion beendet Abbau Stackframe und RET Befehl Zeile 10 13 main wird wie jede andere Funktion bersetzt Stackframe und Platz f r lokale Variable auf dem Stack drei Integer zu je 4 Byte zwei Zeiger zu je 4 Byte eine float Var zu 4 Byte ergeben 24 Byte 18h daher also sub esp 18h Initialisierung von f mit 32 Bit Zeile 16 Adresse Offset von a via EAX nach pl kopieren Zeile 17 Der Wert 100 64h wird auf den Speicherplatz geschrieben dessen Adresse in pl steht Zeile 18 Kopieren der Adresse in pl via EDX nach p2 Zeile 19 Die drei Argumente des printf Aufrufs werden beginnend mit dem letzten nach einander auf den Stack gebracht Aufruf der Bibliotheks Prozedur printf anschliessende Stackbereinigung 12 Byte Zeile 21 Wert 25 19h in Variable b Zeile 22 a und b auf den Stack bringen Aufruf der selbstgeschriebenen Prozedur Produkt acht Byte wieder vom Stack entfernen Funktionsergebnis aus EAX entnehmen und in c kopieren Zeile 23 zwei Parameter auf Stack bringen Aufruf von printf R ckgabewert wird
38. beginnt die Suche bei Bit 0 LSB BSR beginnt beim MSB Sind alle Bits Null wird das Zeroflag gel scht Wenn nicht wird das Zeroflag gesetzt und die gefundene Bitposition im Zielregister gespeichert mov dx 0100001101101100b bsf cx dx Bit 2 ist erstes 1 Bit gt cx 2 6 4 Testfragen 1 Bestimmen Sie den Inhalt der Register AX BX CX DX nach der Ausf hrung der folgen den Befehle 6 4 TESTFRAGEN mov and mov or mov xor mov not ax OFEDCh ax 1234h bx 1234h bx 4321h cx 6789h cx 9876h dx 12EFh dx 87 2 Bestimmen Sie den Inhalt der Register AL BL CL DL nach der Ausf hrung der folgenden Befehle mov shl mov sar mov rol mov sal rcl al 95h al 2 b1 95h bl 1 c1 95h c1 2 dl 95h dl 1 dl 1 3 Schreiben Sie eine Programmsequenz die folgende Bitoperationen an Register AX vor nimmt e Bit 0 und Bit 5 l schen e Bit 1 und Bit 3 setzen e Bit 2 und Bit 7 invertieren e alle anderen Bits unver ndert lassen Formulieren Sie die Konstanten bin r und hexadezimal 4 F hren Sie nur mit Bitbefehlen sowie mov und add folgende Berechnung aus AX 17 BX 9 CX Ein Register berlauf soll zun chst nicht betrachtet werden 5 Schreiben Sie ein Programmst ck das nur mit Bitbefehlen sowie add und evtl mov arbeitet und folgendes ausf hrt Der Inhalt von ax soll um eins erh ht werden wenn in Register BX Bit 7 0 ist Antworten auf Seite 128 Kapitel 7 Sprungbefehle Sprung
39. bleiben und durch die Anwendung d h das eigene Programm belegt werden k nnen In der Assemblerprogrammierung werden die Aufrufe der dritten und vierten Gruppe h ufig benutzt Die Belegung der Interrupts ist teilweise vom Typ des Rechners bzw der Betriebssy stemversion abh ngig In der folgenden Tabelle ist ein Auszug gegeben 46 KAPITEL 5 BETRIEBSSYSTEMAUFRUFE Nr Bedeutung Gruppe 0 Division durch Null Exc 1 Einzelschrittbetrieb Exc 2 NMI Exc 3 Breakpoint Exc 4 Overflowauswertung mit INTO Exc 5 Bound Print Screen Exc BIOS 6 ung ltiger Opcode Exc 7 kein Coprozessor vorhanden Exc 8 IRQO Timerbaustein 18 2 mal pro sec HW 9 IRQ1 Tastatur HW Ah IRQ2 kaskadierter 8259 IRQ8 IRQ15 HW Bh IRQ3 COM2 HW Ch IRQ4 COM1 HW Dh IRQ5 LPT2 HW Eh IRQ6 Diskettenlaufwerk HW Fh IRQ7 LPT1 HW 10h Videotreiber BIOS 11h Ermittlung der Systemkonfiguration BIOS 12h Speichergr e ermitteln BIOS U BIOS 14h Serielle Schnittstelle BIOS 15h Extended Memory Zusatzfunktionen BIOS 16h Tastatur BIOS 17h Drucker BIOS Cl BIOS 1Ah Systemuhr BIOS e BIOS 1Fh Adresse der Grafikzeichensatztabelle BIOS 20h Programmende DOS 21h DOS Funktionsaufruf Funktionsnummer in AH bergeben DOS als DOS 27h Programm beenden und resident halten TSR DOS ee DOS 2Fh CD Rom DOS Kill DOS 33h Maus DOS 60h f r eigene Anwendungen User Falle User 67h f r eigene Anwendungen U
40. dec ax ax um 1 erniedrigen Ergebnis ist Null Zeroflag wird gesetzt Signflag Das Signflag SF Vorzeichenflag ist gesetzt wenn das Ergebnis der letzten Operation negativ war Beispiel mov ax 5 Zahlenwert 5 nach ax einschreiben sub ax 7 7 von ax subtrahieren Ergebnis ist negativ Signflag wird gesetzt 1 2 REGISTER UND FLAGS DES 80386 17 Carryflag Das Carryflag CF bertragsflag ist gesetzt wenn bei der letzten Operation der vorzeichenlose Wertebereich berschritten wird Anders ausgedr ckt wenn die Anzahl der vorhandenen Bits f r das Ergebnis nicht ausreicht s auch Overflowflag Beispiel mov al 250 Zahlenwert 250 nach al einschreiben add al 10 10 zu al addieren Ergebnis 260 berschreitet den Wertebereich da AL ein 3 Bit Register ist und die Werte 0 255 darstellen kann Carryflag wird gesetzt Overflowflag Das Overflowflag OF berlaufsflag ist gesetzt wenn bei der letzten Operation der vorzeichen behaftete Wertebereich berschritten wird Im Gegensatz zum Carryflag betrifft das Overflowflag das Rechnen mit vorzeichenbehafteten Zahlen also Zahlen die positiv und negativ sein k nnen Beispiel mov al 120 Zahlenwert 120 nach al einschreiben add al 10 10 zu al addieren Ergebnis 130 berschreitet den Wertebereich da AL ein 8 Bit Register ist und die Werte 128 127 darstellen kann Overflowflag wird gesetzt Parityflag Das Parityflag PF Parit tsflag wird gesetzt wenn bei der l
41. den Registern Zun chst einmal kann man zu Beginn einer Assembler Sequenz nicht annehmen dass ein Regi ster einen bestimmten Wert hat der Inhalt der Register ergibt sich aus der Vorbenutzung im normalen Programmablauf Fine Assemblersequenz oder funktion darf die Register EAX EBX ECX und EDX ohne weiteres ndern Dagegen sollten die Register EBP ESP EDI ESI DS CS und SS nicht ver ndert bzw wieder hergestellt werden Operatoren zur Gr enbestimmung Mit den Operatoren TYPE LENGTH und SIZE kann die Gr e einer C C Variablen be stimmt werden TYPE gibt die Gr e einer einzelnen Variablen oder eines Typs zur ck LENGTH gibt die Anzahl der Elemente eines Feldes zur ck Einzelvariable 1 SIZE gibt die Gesamtgr e einer Variablen oder eines Feldes zur ck Es gilt daher SIZE TYPE LENGTH Beispiel nach int feld 5 ist TYPE feld 4 LENGTH feld 5 und SIZE feld 20 13 6 EINBINDUNG VON ASSEMBLERCODE IN C C PROGRAMME 107 Zugriff auf C C Variable Die C C Variablen k nnen direkt ber ihren Bezeichner Namen angesprochen werden Es ist aber auch m glich ihr Adresse zu laden und die Variablen dann ber den Zeiger zu erreichen Beispiele int Anzahl index puffer 10 struct person char name int alter e struct person student Zugriff auf einfache Variable _asm Direkter Zugriff auf Variablen mov eax Anzahl Laden einer Variablen in ein Register shl index 2 Bearbeitung einer Var
42. den ersten 16 Bit Prozessor Er erfuhr sehr starke Verbreitung weil er im IBM PC eingesetzt wurde dem bald meistver breiteten Mikrocomputer Bei der Einf hrung des i8086 versuchte man die bertragung von 8 Bit Programmen auf den neuen 16 Bit Prozessor zu erleichtern und erm glichte wahlweise den Zugriff auf die neuen 16 Bit Register in zwei 8 Bit Gruppen So kann man das Hauptre chenregister AX wahlweise als zwei unabh ngige 8 Bit Register ansprechen AL Low Byte und AH High Byte Der Befehl MOV AX 1234h ist absolut gleichwertig den beiden Befehlen MOV AH 12h MOV AL 34h Der i8086 war der erste Prozessor einer langen und erfolgreichen Reihe die Nachfolgetypen waren der i80186 180286 i80386 i80486 und Pentium in vielen Varianten Die Firma Intel hielt sich dabei streng an das Prinzip der Aufw rtskompatibilit t das bedeutet jeder neue Prozessor hat alle Funktionalit t seiner Vorg nger und zus tzlich neue Features So enth lt z B ein Pentium Prozessor in seinem Befehlssatz noch alle Befehle die der 8086 hatte Ebenso sind die urspr nglichen 16 Bit Register weiterhin als Teilgruppe der jetzigen 32 Bit Register ab 386 verf gbar Sogar das wahlweise Ansprechen der unteren 16 Bit in zwei 8 Bit Gruppen ist immer noch m glich Somit k nnen ltere Programme ohne Ver nderung des Maschinencodes unmittelbar auch auf den neueren Prozessoren laufen Dieses Prinzip war f r die Verbreitung der PC s und ihrer Software sehr wichtig
43. fp Variable Gleitkommazahl mit 32 64 oder 80 Bit IN st 0 laden FILD int Variable Ganzzahl Integer mit 16 32 oder 64 Bit laden FBLD BCD Variable gepackte BCD Zahl mit 80 Bit laden Ebenfalls n tzlich ist es dass FLD auch auf Stackregister angewendet werden kann z B FLD ST 2 Dieser Befehl legt eine Kopie von ST 2 an die Spitze des Stack Dabei wird der Wert in ST 0 zu ST 1 usw ST 0 und ST 3 enthalten also nun den gleichen Wert Den Datentransport von 86 KAPITEL 11 DIE GLEITKOMMAEINHEIT den FPU Registern in den Speicher nennt man Speichern Store Die entsprechenden Befehle zum Abspeichern von Daten sind ST Store FST fp Variable Stackregister ST 0 als Gleitkommazahl mit 32 64 oder 80 Bit speichern FIST int Variable ST 0 als Ganzzahl Integer mit 16 32 oder 64 Bit speichern FBST BCD Variable ST 0 als gepackte BCD Zahl mit 80 Bit speichern Bei diesen Speicher Befehlen wird aber keine Zahl vom Stack entfernt also kein implizites POP durchgef hrt Dies erreicht man erst durch die Befehlsvarianten mit dem angeh ngten P FSTP fp Variable Stackregister Gleitkommazahlen mit 32 64 oder 80 Bit speichern und POP FISTP int Variable Ganzzahlen Integer mit 16 32 oder 64 Bit speichern und POP FBSTP BCD Variable gepackte BCD Zahlen mit 80 Bit speichern und POP FST und FSTP k nnen auch auf Stackregister angewendet werden womit der Wert des betref fenden Registers einfach berschrieben wird So legt beispielsweise FSTP ST 3 S
44. gelinkt gebunden TLINK Dateiname OBJ Aus dem Assemblerprogramm ist nun ein ausf hrbarer Dateiname EXE File geworden Er kann nun mit Dateiname CR aufgerufen werden Beim allen Aufrufen kann die Extension des Dateinamens weggelassen werden also TASM Da teiname TLINK Dateiname Um das Programm zu testen ist ein Debugger sehr n tzlich Der Turbo Debugger TD kann vorteilhaft benutzt werden wenn beim Assemblieren und Linken zus tzliche Informationen ein gef gt werden Dies geschieht durch folgende Optionen 14 4 EIN RAHMENPROGRAMM 123 TASM zi Dateiname TLINK v Dateiname TD Dateiname Zum Editieren der Assemblerprogramme kann ein beliebiger Editor benutzt werden z B EDIT Ultraedit Winedt usw Der Turbo Debugger ist auch ein gutes Lernhilfsmittel Nach dem Aufruf steht er vor der ersten ausf hrbaren Zeile Mit ALT V R kann das Register Fenster ge ffnet werden mit F8 kann ein Einzelschritt ausgef hrt werden dabei kann man alle Register und Flags beobachten Ein Programmneustart erfolgt mit CTRL F2 ein Breakpoint kann mit F2 gesetzt werden Zu jedem Fenster gibt es ein lokales Men das mit ALT F10 oder der rechten Maustaste auf gerufen wird Die Hilfetaste F1 gibt Hilfstexte aus Im CPU Fenster hat man eine besonders maschinennahe Sicht auf das Programm Man sieht den erzeugten Maschinencode die Register die Flags einen Ausschnitt aus dem Datenspeicher und einen Ausschnitt aus dem Stack Auch hier gi
45. geschrieben werden Kommentar ist eine Kommentar zu dieser Zeile er kann am Ende der Zeile nach einem Semikolon angef gt werden Alle Bestandteile sind in eckigen Klammern aufgef hrt weil sie unter Umst nden entfallen k nnen Erlaubt sind auch reine Kommentarzeilen und Leerzeilen Alternativ zu den Befehlszeilen gibt es Direktiven Diese werden nicht in ausf hrbaren Maschi nencode umgesetzt sondern steuern nur den Assembler beim bersetzungslauf Unser erstes Programm Programm HELLO ASM 3 MODEL SMALL Speichermodell SMALL Die maximale Gr e von Datensegment und Codesegment ist je 64kB STACK 100h 256 Byte Stack reservieren DATA Beginn des Datenbereichs Meldung DB Hallo Welt 13 10 Reservierung von Speicherplatz und Vorbelegung mit Text und Steuerzeichen 13 Carriage Return d h R cksprung in Spalte 1 10 Line Feed d h Zeilenvorschub CODE Beginn des Codebereichs Assemblerbefehle Programmstart Label haben einen Doppelpunkt am Ende mov ax data Uebergabe der Adresse des Datensegments zur Laufzeit mov ds ax DS zeigt nun auf das Datensegment 20 KAPITEL 1 EINF HRUNG mov ah 9 DOS Funktion die einen durch begrenzten String auf den Bildschirm ausgibt mov dx OFFSET Meldung Offset der Adresse des Strings int 21h Interrupt 21h Aufruf von DOS Programmende die Kontrolle muss explizit an DOS zurueckgegeben werden mov ah 04Ch ah 04C DOS
46. goto angesprungen werden Gro Kleinschreibung muss dabei nur beachtet werden wenn mit goto eine C C Sprungmarke angesprungen wird Die Namen von Sprung marken sollten nicht mit den Namen von C Bibliotheksfunktionen bereinstimmen z b exit Operatoren Zeichen die in C C und Assembler Operatoren bezeichnen wirken in Inline Assembler als Assembleroperatoren Beispiel der Stern bezeichnet keinen Zeiger sondern eine Multiplika tion bei der Adressberechnung Index Skalierung Anlegen von Daten In Inline Assembler k nnen keine Daten angelegt werden die Direktiven DB DW DD usw sind nicht erlaubt Aufruf von C C Funktionen Der Aufruf von C C Funktionen ist m glich der Assemblercode muss nur vorher die Para meter auf dem Stack hinterlegen Beispiel char text Zaehler i n int zaehler 100 asm 13 6 EINBINDUNG VON ASSEMBLERCODE IN C C PROGRAMME 109 mov eax zaehler push eax lea eax text push eax call printf add esp 8 C Funktionen k nnen nur aufgerufen werden wenn sie global sind Die R ckgabe von Funktionsergebnissen Der MS Visual C Compiler und andere Compiler ebenfalls legt die Programme so an dass Funktionsergebnisse m glichst im Register EAX bzw Teilen davon zur ckgegeben werden Funk tionen in Inline Assembler m ssen sich an die gleichen Konventionen halten Die folgende Tabelle gibt einen berblick Funktionstyp R ckgaberegister char AL
47. in Hochsprachen und codiert sehr zeitkritische und sehr hardwarenahe Abschnitte in Assembler 1 2 REGISTER UND FLAGS DES 80386 13 1 2 Register und Flags des 80386 1 2 1 Mikroprozessoren In Abb 1 2 1 ist stark vereinfacht ein Mikroprozessorsystem dargestellt Uber die Adresslei tungen wird im Hauptspeicher und in anderen Bausteinen die richtige Speicherzelle ausgew hlt und ber die Datenleitungen werden die Bitmuster vom und zum Prozessor transportiert Die Steuerleitungen dienen dazu von den parallel geschalteten Bausteinen immer den richtigen zu aktivieren Steuerleitungen prozessor Hauptspeicher andere Bausteine B8 2301 BB000203C3 z B Schnittstellen Abbildung 1 1 Grunds tzlicher Aufbau eines Mikroprozessorsystems Die Bestandteile eines Prozessors lassen sich in vier Gruppen einteilen e Das Steuerwerk erzeugt die notwendigen Signale f r die internen und externen Steuerlei tungen Busschnittstelle e Das Adresswerk erzeugt auf den Adressleitungen das notwendige Bitmuster um die im Assemblerbefehl beschriebene Speicherzelle anzusprechen e Das Operationswerk f hrt die bitweisen und arithmetischen Operationen auf Datenope randen aus e Der Registersatz als spezieller Teil des Operationswerkes enth lt eine gewisse Anzahl pro zessorinterner Speicherzellen und Flags 1 2 2 Bits und Bytes Ein Register ist eine Gruppe von Flipflops 1 Bit Speicher mit gemeinsamer Steuerung Register u
48. jedem Befehl nur einen Speicheroperanden adres sieren Es geht also nicht mov Variable1 Variable2 2 4 4 Die indirekte Speicheradressierung Die direkte Adressierung reicht nicht mehr aus wenn die Adresse der Speicherzelle erst zur Laufzeit bestimmt wird Das kommt z B bei Feldern h ufig vor Nehmen wir z B folgende Aufgabenstellung F r eine Zeichenkette soll die H ufigkeit der darin vorkommenden Zeichen bestimmt werden Man braucht ein weiteres Feld um die H ufigkeit jedes Zeichens abzuspeichern Bei der Bestim mung der H ufigkeit muss f r jedes erkannte Zeichen der dazu geh rende H ufigkeitsz hler um eins erh ht werden Auf welchen Speicherplatz zugegriffen wird ergibt sich also erst zur Lauf zeit und h ngt von den Daten ab Eine direkte Adressierung wie z B inc Haufigkeit 5 usw reicht nicht aus Ebenso liegt der Fall bei der Programmierung von Sortieralgorithmen und vielen anderen Problemstellungen der Informatik Bei dem Problem der H ufigkeitsbestimmung w re nach den Deklarationen DATA Zeichenkette DB ABCDEfGH Haeufigkeit DB 26 DUP 0 im Codesegment eine direkte Adressierung wie z B inc Haeufigkeit 3 2 4 ADRESSIERUNGSARTEN 31 nicht zweckm ig sie w rde immer das Feldelement Nr 3 das vierte ansprechen Man m te statt der 6 etwas Variables einsetzen k nnen Genau dies erlaubt die Register indirekte Adressierung auch kurz indirekte Adressierung Mit den Befehlen mov bx 3 Vor
49. k nnen Ganzzahlwerte beliebiger Bitbreite addiert werden Man addiert zun chst die niederwertigste Einheit Wort Doppelwort mit ADD und addiert die h herwertigen Einheiten mit ADC so dass ein durch gesetztes Carryflag angezeigter bertrag bei der darauffolgenden Addition einbezogen wird Beispiel Addition zweier 64 Bit zahlen add eax Zahllow addiert niederwertige Doppelworte adc edx Zahlhigh addiert h herwertige Doppelworte F r die Subtraktion gibt es die Befehle SUB Subtract und SBB Subtract with Borrow Diese sind formal genauso aufgebaut wie ADD ADC und arbeiten auch genauso zusammen Zu beachten ist dass bei der Subtraktion der zweite Operand vom ersten subtrahiert wird sub cx bx subtrahiert bx von cx Ergebnis nach cx sub al 6 subtrahiert 6 von al Erg nach al sub zaehler ax subtrahiert ax von zaehler Ergebnis in zaehler sub esi dwort subtrahiert dwort von esi Ergebnis in ebx Der Befehl CMP Compare ist eigentlich eine Sonderform von SUB Er arbeitet intern genau wie SUB schreibt allerdings das Ergebnis nicht zur ck in den ersten Operanden Der Sinn von CMP liest im Setzen der Flags 8 3 Multiplikation 8 3 1 Vorzeichenlose Multiplikation MUL Der Befehl erlaubt die Multiplikation zweier Operanden gleicher Bitbreite und ber cksichtigt dass das Ergebnis doppelt so viele Bit haben kann Man unterscheidet die Byte Wort und Doppelwortmultiplikation Bezeichnung Multiplikator
50. man ihn heute mit einem zwei oder drei Operanden benutzen kann IMUL mit einem Operanden Diese Variante entspricht genau dem MUL Befehl kann also zur Byte Wort und Doppelwort Multiplikation benutzt werden und verwendet Operanden und Register in der gleichen Weise Der Operand Multiplikator kann ein Register oder eine Speichervariable mit 8 16 oder 32 Bit sein Multiplikand ist AL AX oder EAX Ergebnis in AX DX AX oder EDX EAX IMUL mit zwei Operanden Die beiden Operanden sind Multiplikand und Multiplikator das Ergebnis wird im ersten Operanden abgelegt wie z B bei ADD Syntax IMUL reg16 Direktwert8 16 IMUL reg32 Direktwert8 32 IMUL reg16 reg16 mem16 IMUL reg32 reg32 mem32 Beispiel imul ebx ecx Multipliziert ebx mit ecx Erg nach ebx IMUL mit drei Operanden Der erste Operand ist das Zielregister der zweite und dritte sind sind Multiplikand und Multiplikator Der Multiplikator muss hier ein Direktwert sein 72 KAPITEL 8 ARITHMETISCHE BEFEHLE Syntax IMUL reg16 regl6 mem16 Direktwert8 IMUL reg16 reg16 mem16 Direktwert16 IMUL reg32 reg32 mem32 Direktwert8 IMUL reg32 reg32 mem32 Direktwert32 Beispiel imul edi ebx 5 Multipliziert ebx mit 5 Erg nach edi Der IMUL Befehl setzt die beiden Flags CF und OF Die IMUL Variante mit einem Operanden setzt die Flags wie der MUL Befehl OF CF 0 wenn die obere H lfte der Ergebnisbits Null ist CF OF 1 sonst Die anderen IMUL Varianten setzen CF 0F 1 wenn das E
51. ndern und auswerten bedingter Sprung zu Schleifenende Schleifenrumpf Befehle unbedingter Sprung zu Schleifenstart Schleifenende In einem Beispiel wird die Ausgabe einer durch Nullbyte begrenzten Zeichenkette ASCIIZ String gezeigt mov bx offset Zeichenkette Schleifenstart mov dl bx N chstes Zeichen cmp d1 0 Begrenzungszeichen je Schleifenende mov ah 2 Schleifenrumpf Ausgabe int 21h mit Int 21h Funktion 2 inc bx um 1 erh hen da Byte Feld jmp Schleifenstart Schleifenende Bei der Programmierung von Schleifen gibt es viele Variationsm glichkeiten Die Z hler k nnen Register oder Speichervariable sein die Z hler k nnen erh ht oder erniedrigt werden die Be dingungen k nnen arithmetisch sein oder sich direkt auf Flags beziehen u a m 7 4 DIE LOOP BEFEHLE 63 7 4 Die Loop Befehle 7 4 1 Loop Der Loop Befehl ist ein Spezialbefehl f r die Programmierung von Schleifen engl Loop Schlei fe Der Loop Befehl erniedrigt CX bzw in 32 Bit Segmenten ECX und springt anschlie end zu einem als Operanden angegebenen Sprungziel falls CX bzw ECX nicht 0 ist Damit lassen sich sehr einfach Z hlschleifen programmieren deren Z hlindex in CX ECX gef hrt wird und abw rts bis auf O l uft Im folgenden Beispiel wird ein Datenbereich von 1024 Byte mit OFFh initialisiert mov bx offset Datenbereich mov ecx 256 Schleifenstart mov bx OFFFFFFFFh 8 Byte schreiben add bx 8 loop schleifenstart Ei
52. unmittelbaren Adressierung immediate adressing steht der Quelloperand unmittelbar im Befehl Er wird bei Ubersetzung fest in den Maschinencode eingebunden und folgt unmittelbar auf den Befehlscode Beispiel mov bx 9 wird im Maschinencode zu BO 09 2 Auch der 386 und seine Nachfolger unterst tzen weiterhin Segmente diese sind aber mehr zur Verwaltung des Multitaskings gedacht und sind mit mehreren Schutzmechanismen ausgestattet 30 KAPITEL 2 ORGANISATION UND BENUTZUNG DES HAUPTSPEICHERS 2 4 2 Registeradressierung Bei der Registeradressierung sind Quelle und Ziel interne Register des Prozessors Beispiel mov ebx ebp 2 4 3 Direkte Speicheradressierung Bei der direkten Speicheradressierung wird der Offset des adressierten Speicherplatzes direkt angegeben und liegt nach der Assemblierung fest Die Angabe des Offsets kann als konstante Zahl oder besser als Variablenname erfolgen Der Variablenname kann muss aber nicht in eckigen Klammern eingeschlossen sein Es k nnen auch Feldelemente direkt adressiert werden indem nach dem Feldnamen ein Pluszeichen und eine Konstante folgen Beispiele mov ax Zaehleri Direkte Adressierung ohne eckige Klammern mov bigcount ecx Direkte Adressierung mit eckigen Klammern mov ecx Feld 2 Direkte Adr von Feld 2 Byte mov al 0020 Direkte Adressierung ber Offsetwert schlecht und von manchen Assemblern beanstandet Achtung Die Intel80x86 Prozessoren k nnen in
53. x logaX Y ST 1 X ST 0 FYL2XP1 ST 0 Y x loga X 1 Y ST 1 X ST 0 0 0 F2XM1 A 1 X ST 0 FSCALE ST 0 oY y ST 1 11 3 5 Vergleichsbefehle COM Compare FCOM ST i Vergleiche ST FCOM fp Variable Vergleiche ST FICOM int Variable Vergleiche ST FCOMI fp variable vergleiche ST und ST i und fp Variable und int Variable und fp Variable und setze EFlags f r Jcc Befehle SS Ei ee 88 KAPITEL 11 DIE GLEITKOMMAEINHEIT Zus tzlich gibt es die Varianten FCOMP und FICOMP die nach dem Vergleich ST 0 vom Stack entfernen FCOMPP und FICOMPP entfernen ST 0 und ST 1 vom Stack In einem abschlie enden Beispiel soll mit einer einfachen Berechnung die Benutzung der Gleit kommaeinheit gezeigt werden Dabei wird die H he eines senkrecht geworfenen K rpers ohne Luftreibung berechnet Diese ist bekanntlich durch 1 h vot qe gegeben wenn vo die Anfangsgeschwindigkeit t die Zeit und g die Erdbeschleunigung ist Das Programm benutzt nur die beiden ersten Register des Gleitkommastacks st 0 und st 1 F r die Berechnung wird die obige Formel geschrieben als h vo 3 gt t Berechnung der Hoehe eines K rpers beim senkrechten Wurf nach oben mit der Gleitkommaeinheit MODEL SMALL Speichermodell SMALL STACK 100h 256 Byte Stack reservieren DATA Fliesskommavariablen mit 64 Bit vo dq 13 5 g dq 9 81 einhalb dq 0 5 t dq 1 3 Hoehe dq CODE 386 387 Programmstart
54. zu setzen Im folgenden Beispiel wird in AX Bit 3 gel scht In BX werden alle Bits au er Bit 6 gel scht Anschlie end wird ein bedingter Sprungbefehl ausgef hrt falls Bit 6 gleich Null ist verzweigung and AX 1111111111110111b oder auch and ax FFF7h ol 52 KAPITEL 6 BITVERARBEITUNG and BX 0000000001000000b oder auch and bx 40h jz Bit6gleichNull Sprung wird ausgef hrt wenn Ergebnis Null Ergebnis Null wenn Bit 6 gleich Null TEST eine n tzliche Variante von AND Will man mit dem AND Befehl mehrere Bits pr fen muss man den Operanden jeweils vorher sichern weil er beim ersten AND schon ver ndert wird F r diese Anwendung ist der Befehl TEST ma geschneidert Er arbeitet genau wie AND mit dem einen Unterschied dass er das Ergebnis nicht in den ersten Operanden zur ckschreibt Die Flags werden aber wie bei AND gesetzt Der Nutzen des TEST Befehls liegt allein in der Auswertung dieser Flags Im folgenden Beispiel wird nacheinander Bit 2 und Bit 4 von EAX ausgewertet ohne EAX zu ver ndern test eax 04h Bit 2 gesetzt jnz Bit2gesetzt jump if not zero test eax 10h Bit 4 gesetzt jz Bit4gesetzt jump if zero OR das logische ODER Ein bitweise logisches ODER wird durch den Befehl OR durchgef hrt Die Ergebnisbits sind nur dann gleich Null wenn beide Operandenbits gleich Null sind sonst Eins F r die Operanden gilt das gleiche wie bei AND OR ist geeignet um ausgew hlte Bits eines Operanden gleic
55. 0 steigende Adressen REPNE SCASW repeat scan string word Schleife 16 10 Ein und Ausgabebefehle Input Output IN Input from Port Eingabe von Port Syntax IN Ziel I O Adresse Ziel AL AX EAX I O Adresse Direktoperand DX Flags Beschreibung Dieser Befehl dient zur Eingabe von Daten ber I O Ports Eine unmit telbare Adressierung des Ports ist m glich wenn die Adresse kleiner als 100H ist Siehe auch OUT Beispiele IN al 20h ISR des 8259A auslesen MOV DX 3F8h IN AL DX Empf ngerpufferregister von COM1 lesen Output from Port OUT Ausgabe von Port Syntax OUT I O Adresse Quelle I O Adresse Direktoperand DX Quelle AL AX EAX Flags Beschreibung Dieser Befehl dient zur Ausgabe von Daten ber I O Ports Eine unmit telbare Adressierung des Ports ist m glich wenn die Adresse kleiner als 100H ist Siehe auch IN Beispiele OUT 20h 66h OCW ber Port 20h an Interruptcontroller senden MOV DX 3F9h Interrupt Enable Register IN AL DX von COM1 lesen OR AL 03h Bits zur Interruptaktivierung setzen OUT DX AL zur ckschreiben ins Register 16 11 SCHLEIFENBEFEHLE 153 16 11 Schleifenbefehle LOOP GE Schleife Syntax LOOP label short label short Label im Bereich 128 bis 127 Byte Flags Beschreibung Befehl dekrementiert ECX CX und springt zur angegebenen Marke falls ECX CX 0 Der Befehl dient der einfachen Konstruktion von Schleifen u
56. 0 Adressleitungen mit dem er 22 1MB Haupt speicher adressieren ansprechen kann Das auf den Adressleitungen anliegende Bitmuster die physikalische Adresse umfasst also 20 Bit Wie wir wissen hat der Intel8086 aber keine Register mit mehr als 16 Bit Er kann also eine physikalische Adresse nicht in einem Register speichern Mit seinen 16 Bit Registern kann er nur einen Speicher von 216 64kB direkt adressieren Man hat das Problem wie folgt gel st e Bei den Prozessoren i8086 bis i80286 wird der Inhalt zweier 16 Bit Register kombiniert um eine 20 Bit Adresse zu erhalten e Ab dem i80386 stehen 32 Bit Register zur Verf gung Der zweite Punkt wird im n chsten Abschnitt behandelt Der physikalische Adressraum ist 0 22 1 0 FFFFFh 0 1048575d um diese physikalischen Adressen zu bilden werden zwei 16 Bit Anteile Segment und Offset zu einer 20 Bit Adresse zusammengef gt nach der Formel Physikalische Adresse 16 Segment Offset 26 KAPITEL 2 ORGANISATION UND BENUTZUNG DES HAUPTSPEICHERS Diese Berechnung wird automatisch innerhalb des Prozessors im Adresswerk durchgef hrt Das Adresswerk arbeitet daher nach folgendem Schema 16 Bit Segment 0000 0000 16 Bit Offset 20 Bit Physikalische Adresse Der Segmentanteil dabei wird immer aus einem der Segmentregister genommen Der Offset kann sehr flexibel gebildet werden Man kann ihn zur Laufzeit berechnen lassen als Summe aus zwei Registern und e
57. 123456h 11h mov eax 123456h mov ebx 11h div ebx Pr fen Sie den obigen Code kann es Probleme geben Antworten auf Seite 129 Kapitel 9 Stack und Stackbefehle 9 1 Stackorganisation Ein Stack zu deutsch Stapel ist ein Abschnitt im Hauptspeicher der auf ganz spezielle Art verwaltet wird n mlich als Last in First out Dies bedeutet das zuletzt eingespeicherte Ele ment wird als erstes wieder herausgegeben Man kann dies mit einem Stapel Teller vergleichen Der zuletzt aufgelegte Teller ist der der auch als erster wieder herausgenommen wird Mit gu ter Kenntnis der Verh ltnisse kann man allerdings auch ein Element aus der Mitte des Stack auslesen hnlich wie man mit etwas Geschick auch einen Teller mitten aus dem Stapel ziehen kann Das Konzept des Stack ist so elementar dass es von unserem Prozessor sogar hardwa rem ig unterst tzt wird Es gibt zwei eigens daf r reservierte Register Stacksegment SS und Stackpointer SP F r den Stack gilt e Auf dem Stack gibt es nur Wortzugriffe e Die Register SS und SP enthalten st ndig einen FAR Pointer auf das zuletzt eingespei cherte Wort den Top of Stack TOS e Der Stack w chst abw rts also zu kleiner werdenden Adressen hin e Der Stack wird direkt benutzt durch die Befehle PUSH und POP e Der Stack wird indirekt benutzt durch die Befehle CALL und RET e Der Stack kann mit indirekter Adressierung adressiert werden wenn man BP als Basisre gister benutzt
58. 14 5 Bezeichnungen f r gr ere Informationseinheiten stattdessen werden hier Kommandozeilenbefehle benutzt Mit diesen kann man aber genausogut manchmal sogar besser seine Dateien und Verzeichnisse verwalten Im Folgenden sind einige Befehle vorgestellt Wichtig Jede Eingabe muss mit der Return Taste Enter Pfeil mit Haken abgeschlossen werden e es werden keine langen Namen unterst tzt Dateinamen d rfen max 8 3 Zeichen haben Verzeichnisnamen max 8 Zeichen e Die DOS Kommandozeile unterscheidet nicht zwischen Gro und Kleinschreibung e In Dateinamen kann ein Stern als sog Joker eingesetzt werden dieser steht dann f r alle Dateinamen Beispiel asm steht f r alle Dateinamen mit Extension asm Prompt Unter Prompt versteht man das Bereitschaftszeichen am Anfang der Zeile Meist ist der Prompt so eingestellt dass er das aktuelle Laufwerk und das aktuelle Verzeichnis anzeigt Falls nicht kann er mit dem Kommando prompt P G so eingestellt werden Bsp C ASM gt bedeutet Das aktuelle Laufwerk ist C Festplatte das aktuelle Verzeichnis ist ASM der Rech ner ist bereit und wartet auf ein Kommando Aktuelles Verzeichnis einstellen CD Die Verzeichnisse sind strukturiert wie unter Windows dort hei en sie Ordner Um das aktuelle Verzeichnis einzustellen benutzt man den Befehl CD Change Directory Beispiele CD Zeigt das eingestellte aktuelle Verzeichnis an CD aam wechselt ins Unterverzeichnis a
59. 3 53 S 115 73 S 52 34 4 84 54 T 116 74 t 53 35 5 85 55 U 117 75 u 54 36 6 86 56 V 118 76 v 55 37 7 87 57 W 119 77 w 56 38 8 88 58 X 120 78 x 57 39 9 89 59 Y 121 79 y 58 3A 90 5A Z 122 7A D 59 3B i 91 5B 123 D 60 3C lt 92 5C 124 7C 61 3D 93 5D 125 7D 62 3E gt 94 5E 126 7E R 63 3F 95 5F S 127 7F H Tabelle 14 2 Die darstellbaren Zeichen des ASCII Zeichensatzes 119 120 KAPITEL 14 ASSEMBLERPRAXIS Bin r Hexadezimal Dezimal Bin r Hexadezimal Dezimal 0000b Oh Od 1000b 8h 8d 0001b 1h 1d 1001b 9h 9d 0010b 2h 2d 1010b Ah 10d 0011b 3h 3d 1011b Bh 11d 0100b 4h 4d 1100b Ch 12d 0101b 5h 5d 1101b Dh 13d 0110b 6h 6d 1110b Eh 14d 0111b 7h 7d 1111b Fh 15d Tabelle 14 3 Die Zahlen von 0 15 in bin rer dezimaler und hexadezimaler Darstellung Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 MSB LSB Tabelle 14 4 Z hlung der Bits in einem Byte 14 1 1 Informationseinheiten In Mikroprozessorsystemen werden fast immer mehrere Bit zu einer Informationseinheit zu sammengefasst e 4 Bit sind eine Tetrade oder ein Nibble e H Bit sind ein Byte e die Verarbeitungsbreite des Prozessors umfasst ein Maschinenwort oder Wort bei einem Prozessor mit 32 Bit Verarbeitungsbreite sind also 4 Byte ein Maschinenwort e Ausgehend vom Maschinenw
60. 6 Bit 32768 32767 Tabelle 12 1 Die Endwerte der S ttigungsarithmetik zusammengestellt 12 3 Der PMADDWD Befehl Unterst tzung der digitalen Si gnalverarbeitung Um den Sinn des Befehls PMADDWD zu verstehen machen wir einen kleinen Abstecher in die digitale Signalverarbeitung DSV Ein digitales System verarbeitet eine Eingangszahlenfolge z n e n 1 c n 2 wobei x n der letzte Eingangswert ist z n 1 der vorletzte Eingangswert usw Diese Ein gangswerte k nnten z B digitalisierte Signalamplituden von einem Mikrofon einem Modem oder einem Tontr ger sein Sie k nnten aber auch die Helligkeitswerte einer Bitmap sein Das digitale System ermittelt daraus eine Ausgangszahlenfolge y n y n 1 y n 2 Dieses Signal kann digital weiterverarbeitet werden oder aber in ein analoges Signal umgesetzt werden Es wird also aus dem Eingangssignal ein ver ndertes Ausgangssignal gemacht Die Rechenvorschrift nach der die digitale Verarbeitung des Signals erfolgt lautet y n Ayr n Anzia 1 Ain m B y n 1 Bay n 2 Brain k 12 1 Ein digitales signalverarbeitendes System wird also beschrieben durch die Koeffizienten Ao Am Di Bk Sind alle B 0 so handelt es sich um ein System mit endlicher Impulsantwort einen FIR Filter Finite Impulse Response Ist dagegen mindestens ein B 4 0 so handelt es sich um ein System mit unendlicher Impulsantwort Ein
61. 8 Bit und 16 Bit Zeichens tze Der Zeichensatz steht in den Ger ten hardwarem ig zur Verf gung und ordnet jedem Code das Bitmuster des dazu geh rigen Zei chens zu Soll z B das gro e A des ASCII Zeichensatzes auf den Bildschirm ausgegeben werden so muss nur der zugeh rige Code 65d an die Grafikkarte bermittelt werden Ein Mikroprozessor kann aber ein Bitmuster auch als Zahl interpretieren dabei wird nach ganze Zahlen mit und ohne Vorzeichen sowie Flie kommazahlen unterschieden Um die Darstellung der ganzen Zahlen zu verstehen betrachten wir zun chst das uns gel ufige Dezimalsystem in dem zehn verschiedene Ziffern a mit Potenzen der Zahl 10 gewichtet werden Eine Dezimalzahl mit n Ziffern hat den Wert n 1 ZA gel zB 123 1 10 4 2 10 3 100 i 0 In der Mikroprozessortechnik haben die kleinsten Speichereinheiten die Bits nur zwei Zust nde Man hat daher nur die Ziffern 0 und 1 zur Verf gung und stellt die Zahlen im Bin rsystem dar Der Wert einer vorzeichenlosen Bin rzahl unsigned binary numbers ist n 1 Z Yap 8 1 1 0 Dazu ein Beispiel IE E E E ES A A WE 128 64 32 4 1 229d 111001010 Um Bin rzahlen von Dezimal u a Zahlen zu unterscheiden wird an die Ziffernfolge der Buch stabe b angeh ngt 1101b oder die Zahlenbasis als tiefgestellter Index 11015 Da in der Mi kroprozessortechnik immer die Bitstellenzahl begrenzt ist ist auch der Zahlenbereich begrenzt Hier kann man
62. 9 00 13 00 12 ax 1166h cx 2207h edx 09330822h esi 00130009h L sungen der Fragen zu den Transportbefehlen Abschnitt 3 5 1 1 mov al 50h ok 2 mov al 100h Fehler Maximalwert bei 8 Bit Registern ist FFh 3 mov 22 bh Fehler Ziel kann keine Konstante sein 4 mov cx 700000 Ok B mov cx 70000 Fehler Maximalwert 16 Bit Reg FFFFh 65535d 6 mov bx 10001111000000b ok 7 mov eax 17 FFAOOih Fehler Maximalwert 32 Bit Reg FFFFFFFFh 8 mov edx 0244h ok Konstante wird erweitert zu 000002A4h 9 xchg cx 10h Fehler Austausch mit Konstante nicht m glich 10 mov eax 1 ok 1 wird vom Assembler im Zweierkomplement eingesetzt 11 mov eax edi ok 12 mov ah bl ok 13 mov bx bl Fehler Operanden versch Bitbreite BX 16 Bit BL 8 Bit 14 xchg eax bp Fehler Operanden versch Bitbreite EAX 32 Bit BP 15 xchg dx dx ok bewirkt aber nichts 16 mov dl di Fehler Operanden versch Bitbreite DL 8 Bit DI 17 mov bp bh Fehler Operanden versch Bitbreite BP 16 Bit BH 8 Bit 18 19 20 21 22 xchg edi dl mov esi dx xchg esi ebx xchg ch cx mov ch cl 2 EAX 12345678h 127 Fehler Operanden versch Bitbreite EDI 32 Bit DL 8 Bit Fehler Operanden versch Bitbreite ESI 32 Bit DX 16 Bit ok Fehler Operanden versch Bitbreite CH 8 Bit CX 16 Bit ok 3 Zeilen 1 2 Diese beiden Befehle k nnen ersetzt werden durch mov ax 100h Zeilen 3 4 Die beiden Befehle k nnen erse
63. AL Shift Status Byte BIOS INT 1 Oh Funktion 02h Setzen der Cursor Position Vor Aufruf AH 02h BH Bildschirmseite hier 0 DH Reihe oberste 0 Nach Aufruf DL Spalte links 0 5 4 Testfragen Jeder der folgenden f nf Codeabschnitte enth lt einen Fehler entdecken sie die Fehler 50 KAPITEL 5 BETRIEBSSYSTEMAUFRUFE DATA Meldungi DB Ende des Beispielprogramms 13 10 Meldung2 DB Programm beendet 13 10 CODE Programmstart Label haben einen Doppelpunkt am Ende mov ax Odata Uebergabe der Adresse des Datensegments zur Laufzeit mov ds ax DS zeigt nun auf das Datensegment Alle folgenden Abschnitte enthalten je einen Fehler finden Sie diese aooo kkk Abschnittl1 Ekk kk kkk kkk kk mov dx 0FFSET Meldung1 Offset der Adresse des Strings int 21h Interrupt 21h Aufruf von DOS okk Abschnitt aboa kkk kkk 3 mov dl A mov ah 02h Bildschirmausgabe mit DOS int 21 aooo kkk Abschnitt3 Ekk kkk kkk mov ah 03h Funktion 3 Lies Cursorposition und groesse Rueckgabe ch cl erste und letzte Scanlinie S dh dl Reihe und Spalte mov bx 0 Bildschirmseite O int 10h Int 10h Video mov cx 0 mov dx ax kkkkkkkikikikikt Abschnitt4 aokk k kkk kkk mov ah 9 DOS Funktion die einen durch begrenzten String auf den Bildschirm ausgibt mov dx OFFSET Meldung2 Offset der Adresse des Strings int 21h Interrupt 21h Aufruf von DOS
64. EAX bringen und DX ins h herwertige Wort von EAX bringen c CL ins niederwertige Byte von DX bringen und CH ins h herwertige Byte von DX bringen Hierbei m ssen auch die shift Befehle shl und shr benutzt werden 6 Setzen Sie mit einem Transportbefehl das h herwertige Wort von EAX gleich Null ohne das niederwertige Wort zu ver ndern L sungen auf Seite 126 Kapitel 4 Ein und Ausgabe Der Mikroprozessor tauscht nicht nur mit dem Hauptspeicher Daten aus sondern auch mit der Aussenwelt und anderen Hardwarebausteinen Ein einfaches Beispiel ist die Tastatur Wenn der Benutzer eine Taste dr ckt erzeugt die Tastatur einen Code den Scancode Die Tastatur legt diesen Code an einen sog Eingabebaustein der am Bussystem des Computers angeschlossen ist Der Prozessor liest die Daten von diesem Eingabebaustein In anderen F llen m ssen Daten an die Aussenwelt z B einen Drucker bergeben werden Dazu wird ein Ausgabebaustein benutzt Der Prozessor schreibt die Daten auf den Ausgabebaustein und erteilt dem Ausgabebaustein eine Freigabe die Daten an das angeschlossene Ger t weiterzugeben Die Ein und Ausgabebausteine haben Adressen genau wie Speicherpl tze allerdings ist der Adressraum kleiner Man nennt die beiden Vorg nge auch Eingabe und Ausgabe engl Input und Output Der Mikroprozessor hat dazu die beiden Maschinen bzw Assemblerbefehle IN und OUT abgek rzt auch I O Die Ein Ausgabebausteine nennt man auch I O Ports und ih
65. Feld ecx al mov al Feld b1 mov bx bp 10 0 mov si di 1 10h mov bx offset zahl mov cl Feld bx mov cl Feld inc bx 3 Wie ist der Inhalt der Register ax cx edx esi nach der Ausf hrung der folgenden Befehle DATA Bytevar DB 66h wfeld DW 711h 822h 933h 2 5 TESTFRAGEN dwort DD 12001300h CODE mov mov mov mov inc mov add mov bx offset bytevar ax bx di 2 cx bx di di edx bx di di 3 esi bx di Antworten auf Seite 125 37 Kapitel 3 Daten transportieren 3 1 Daten gleicher Bitbreite kopieren MOV Der Hauptbefehl um Daten zu transportieren ist der MOV Befehl Er ist das Arbeitspferd und wahrscheinlich der h ufigste Befehl in 80x86 Programmen Der MOV Befehl kopiert eigentlich die Daten denn er l t die Daten im Quellbereich unver ndert Die Syntax des MOV Befehles ist MOV Zieloperand Quelloperand Ziel und Quelloperanden k nnen Register Speicherpl tze oder Direktwerte Konstanten mit einer Breite von 8 16 oder 32 Bit sein Wichtig ist dass die Bitbreite beider Operanden bereinstimmt Ein Befehl wie MOV EAX BX f hrt zu einer Fehlermeldung wie Operand types do not match weil EAX ein 32 Bit Register ist und BX ein 16 Bit Register Der MOV Befehl hat einige weitere Einschr nkungen e Es k nnen nicht beide Operanden Segmentregister sein e Direktoperanden k nnen nicht in Segmentregister geschrieben werden e Es k nnen nicht beide Operanden Speicherope
66. Funktion terminate the program mov al 0 DOS Return Code O int 21h Interrupt 21h Aufruf von DOS END Programmstart END Ende der bersetzung danach Angabe des Einsprungpunktes Nun also zu unserem ersten kleinen Programm es gibt traditionell die Worte Hallo Welt auf den Bildschirm aus t Es beginnt mit einer Kommentarzeile die den Namen und eine kurze Beschreibung des Programms enth lt Danach folgt mit der Direktive MODEL eine Fest legung des Speichermodells d h eine Angabe dar ber wieviel Platz f r Programmcode und Daten maximal gebraucht wird Speichermodelle werden nur in DOS Umgebungen gebraucht s Abschn 2 Die Direktive STACK legt fest wie viel Speicherplatz f r den Stack reserviert wird einen besonderen Bereich des Hauptspeichers der als Zwischenspeicher in fast jedem Pro gramm benutzt wird Nach der Direktive DATA wird der Datenbereich angelegt Dabei wird nicht nur Platz f r Daten reserviert sondern den Speicherpl tzen werden auch Namen und op tional Vorbelegungswerte zugeordnet Im Beispielprogramm wird eine Variable mit dem Namen Meldung angelegt und mit einer Kette von Buchstaben und Steuerzeichen vorbelegt Nach CODE folgt der Code d h Programmbereich mit den Assemblerbefehlen Die beiden ersten Befehle dienen dazu die Segment Adresse des Datenbereiches zur Laufzeit ins DS Register zu bertragen Da wir die Zeichen nicht einzeln in den Bildschirmspeicher schre
67. HRUNG Stacksegment Stackspeicher Im sog Protected Mode Verwaltung von gesch tzten Datenbe reichen im Multitasking Betrieb dienen sie zur Aufnahme von Selektoren Das Register EIP Extended Instruction Pointer speichert die Adresse des n chsten auszuf h renden Befehls im Programmcode Ein Sprungbefehl hat zur Folge dass einfach EIP neu geladen wird 1 2 4 Flags Das EFlag Register unterscheidet sich v llig von den anderen Registern Die Flipflops in die sen Registern werden n mlich einzeln gesteuert und jedes Flipflop hat eine ganz bestimmte Bedeutung es ist ein Flag Flagge F hnchen Bei den Flags hat sich folgende Sprechweise eingeb rgert e Flag gesetzt bedeutet Flag 1 auch ein Flag setzen engl to set the flag e Flag gel scht bedeutet Flag 0 auch der Befehl l scht das Flag engl to clear the flag Es gibt zwei Gruppen von Flags Statusflags und Steuerflags Statusflags Statusflags sind Flags die der Prozessor nach arithmetischen oder bitweise logischen Operationen setzt um etwas ber das Resultat dieser Operation auszusagen Der Programmierer kann diese Flags dann in bedingten Sprungbefehlen abfragen und Programmverzweigungen vom Zustand der Flags abh ngig machen Zeroflag Das Zeroflag ZF deutsch Nullflag wird gesetzt wenn das Ergebnis der letzten arithmetischen oder bitweise logischen Operation Null war Beispiel mov ax 1i1 Zahlenwert 1 nach ax transportieren
68. Meyer TASM Der Turbo Assembler von Borland Thomson Publ 1994 Unkonventionell im Aufbau Befehle kurz viele Beispiele TSR ausf hrlich 156 LITERATURVERZEICHNIS 157 13 14 Hummel Assemblerprogrammierung tewi 1993 Vermittelt den Stoff ausschlie lich an 9 umfangreichen Beispielen learning by doing Schwerpunkt Betriebssystem P Norton J Socha Peter Nortons Assemblerbuch Markt und Technik Wenig systematisch aber leicht verst ndlich und detailliert bibitembackerprof R Backer Professionelle Assemblerprogrammierung Franzis 1994 Das Buch ist nach Kontexten gegliedert Grafik Maus TSR Protected Mode EMS Win dows Wohak Maurus 80x86 Pentium Assembler Thomson Publ 1995 Aktuelles und umfassendes Werk Themen sind u a Unterschiede der Prozessoren Copro zessor Windows MASM Borland Turbo Assembler Referenz und Benutzerhandbuch Borland GmbH Hogan Thom Die PC Referenz f r Programmierer Systhema Verlag 1992 Nachschlagewerk mit den wichtigsten Informationen ber BIOS DOS Hardware usw in Tabellenform Sinnvolle Erg nzung zu allen Titeln ber Assemblersprache Hogan Thom The Programmer s PC Sourcebook Microsoft Press 1991 Englischsprachiges Original des o a Titels Index berlauf 67 bertragsflag 66 adc 139 add 139 and 51 135 ASCII Zeichensatz 65 Assembler 10 Assemblersprache 10 Aufw rtskompatibilit t 14 Ausgabe 43 Ausgabebaustein 43 bedingte Sprungbef
69. Move Operanden wie Registernamen Konstante oder Variablen werden im Klartext genannt Speicherpl tze k nnen frei w hlbare Namen erhalten und damit wie Variablen in Hochsprachen benutzt werden Ebenso k nnen Sprungmarken Namen erhalten Wir wollen nun die oben stehende Liste von Aktionen zur Ausf hrung von A 5 B 1 in der Assemblersprache des intel 8086 aufschreiben Die Speicherpl tze hei en nun wirklich einfach A und B als Register wurde AX und BX ausgew hlt Die benutzten Assemblerbefehle sind mov bewegen transportieren Ziel zuerst genannt shl shift left Bitmuster nach links verschieben add addieren Summe kommt in ersten Operanden inc inkrementieren Wert um eins erh hen Das Assemblerprogramm st ck sieht dann so aus mov ax B mov bx ax shl ax 2 add ax bx inc ax mov A ax Der Assembler engl Montierer bersetzt dann das in Assemblersprache geschriebene Quell programm und erzeugt so den Maschinencode In der folgenden Liste ist auf der rechten Seite aus den Assemblerbefehlen resultierende Maschinencode eingetragen Man sieht jetzt wie der oben als Beispiel gegebene Maschinencode entstanden ist Assemblerbefehle Daraus erzeugter Maschinencode mov ax B A1 0024 mov bx ax 8B D8 shl ax 2 CL EO 02 add az bs 03 C3 inc ax 40 mov A ax A3 0028 Der Assembler Programmierer muss sich nun nicht mehr um den Maschinencode k mmern und nur noch selten mit absoluten Adressen arbeiten Trotzdem ist Assemblersprache eine direkte
70. O Danach hat der Linker eine ausf hrbare Datei erzeugt HALLO EXE kann durch Aufruf auf der Kommandozeile HALLO Return oder durch Anklicken auf einer Windows Oberfl che gestartet werden Kapitel 2 Organisation und Benutzung des Hauptspeichers im Real Mode Der Real Mode ist die einfache Betriebsart in der die Intel Prozessoren so wie der Urvater 8086 arbeiten Im Unterschied dazu wird im Protected Mode der Speicher v llig anders verwaltet Auf den Protected Mode kann hier nicht eingegangen werden In diesem Kapitel werden die Methoden des Speicherzugriffs behandelt d h das Schreiben in den Speicher und das Lesen aus dem Speicher 2 1 Speichervariablen definieren Am Anfang des Programmes besteht die M glichkeit Speichervariablen unter Angabe von Namen und Typ zu definieren Das bewirkt 1 Es wird dann in einem bestimmten Bereich des Speichers dem Datensegment f r jede Variable die dem Typ entsprechende Anzahl von Bytes freigehalten 2 Dieser Bereich kann sp ter unter dem Namen der Variablen angesprochen werden Der Typ der definierten Variable wird durch eine entsprechende Direktive d h Anweisung an den bersetzer festgelegt Direktive Name Anzahl Byte Beispiele f r einer Einheit Verwendung DB Define Byte 1 8 Bit Variable char Strings DW Define Word 2 16 Bit Variable integer NEAR pointer DD Define Doubleword 4 32 Bit Variable long Far pointer DQ Define Quadword 8 Gleitkommazahl D
71. PITEL 13 DIE SCHNITTSTELLE ZWISCHEN ASSEMBLER UND C C Einbindung externer Assemblerprogramme Das bersetzen und Binden von C C und Assemblermodulen kann mit folgender Komman dozeile ausgef hrt werden BCC CPROG1 CPROG2 ASMPROG1 ASM ASMPROG2 ASM Dabei mu f r die ASM Dateien die Namenserweiterung ASM angegeben werden Die erzeugte lauff hige Datei hei t CPROG1 EXE Alternativ lassen sich gemischte Programme bequem in sog Projekten verwalten die in der inte grierten Entwicklungsumgebung von Borland C angelegt werden In Projekten k nnen Dateien folgender Typen eingebunden sein C CPP ASM OBJ LIB Dabei ist f r den automatisch erfolgenden Aufruf von TASM die Option MX gesetzt so da bei allen externen Symbolen in dem Assemblerquelltext zwischen Gro und Kleinschreibung unterschieden wird Regeln f r gemeinsame Funktionen und Variablen Bei Benutzung der vereinfachten Segmentdirektiven ergeben sich folgende Regeln f r den Aufruf externer Assemblerprogramme aus C Programmen 1 Alle Module m ssen im gleichen Speichermodell bersetzt sein bei den Assemblermodulen kann dabei die Anweisung MODEL benutzt werden 2 Variablennamen die in C und Assemblermodulen vorkommen m ssen in den Assemb lermodulen mit einem vorangestellten Unterstrich Underscore geschrieben werden 3 Externe Assemblerfunktionen werden in den C Modulen als extern und in C Modulen als extern C deklariert in dem Asse
72. PROC NEAR idifferenz2 9 int _stdcall idifferenz2 int a int b push ebp mov ebp esp 102 KAPITEL 13 DIE SCHNITTSTELLE ZWISCHEN ASSEMBLER UND C C push ecx 10 int aminusb Fa aminusb a b mov eax DWORD PTR _a ebp sub eax DWORD PTR _b ebp mov DWORD PTR _aminusb ebp eax 12 return aminusb mov eax DWORD PTR _aminusb ebp 13 mov esp ebp pop ebp ret 8 idifferenz2 CYGHHHCZ ENDP idifferenz2 Aufrufkonvention _fastcall 7 Register Parameter bergabe 7 Reihenfolge von rechts nach links aufrufende Funktion r umt Stack auf _a 8 _b 12 _aminusb 4 idifferenz300CYIHHHCZ PROC NEAR idifferenz3 15 int _fastcall idifferenz3 int a int b 4 push ebp mov ebp esp sub esp 12 0000000cH mov DWORD PTR _b ebp edx mov DWORD PTR _a ebp ecx 16 int aminusb 17 aminusb a b mov eax DWORD PTR _a ebp sub eax DWORD PTR _b ebp mov DWORD PTR _aminusb ebpl eax 18 return aminusb mov eax DWORD PTR _aminusb ebp 19 mov esp ebp pop ebp ret 0 idifferenz300CYIHHH0Z ENDP idifferenz3 _i 4 j 8 _k 12 _main PROC NEAR 21 main 4 push ebp mov ebp esp sub esp 12 0000000cH 13 5 STEUERUNG DER KOMPILIERUNG 103 22 int i j K 23 24 i 100 mov DWORD PTR _i ebpl 100 00000064H 5 25 sis mov DWORD PTR _j lebp 1 26 5 27 ksidifferenz1 i j mov eax DWORD PTR _j Lebp push ea
73. Programms sein 112 KAPITEL 13 DIE SCHNITTSTELLE ZWISCHEN ASSEMBLER UND C C 2 Der Assemblerbefehl wird mit Zeilenvorschub CR oder Semikolon abgeschlossen mit einem Semikolon kann aber kein Kommentar eingeleitet werden 3 Ein Kommentar mu als C Kommentar bzw C Kommentar geschrieben werden also in x x bzw 4 Sprungbefehle in Inline Assembler d rfen sich nur auf C Labels beziehen 5 Befehle die nicht verzweigen d rfen alles au er C Labels verwenden 6 in Inline Assembler wird keine automatische Gr enanpassung beim Zugriff auf Speicher variable gemacht sie m ssen ggf explizit durch BYTE PTR WORD PTR usw vorgenommen werden include stdio h include conio h Demonstration der Anwendung von Inline Assembler in C bzw C Programmen main Definition von C Variablen unsigned char c1 c2 short k char puffer 80 Morlenstund hat gold im Mund char zb char far sbb char x PP printf n n Demo Programm Inline Assembler in C Programmen n Zugriff auf Bytevariable ci1 A asm mov al ci Lesen einer Speichervariablen asm inc al asm mov c2 al Schreiben einer Speichervariablen printf c1 c c2 Yc n c1 c2 asm inc byte ptr c2 Bei moeglicher Mehrdeutigkeit muss die Datenbreite angegeben werden printf c2 c n c2 Zugriff auf Wortvariable k 50 asm mov ax k asm shl ax 1 asm mov k ax 13 6 EINBINDUNG VON ASSEMBLERCODE IN C
74. R cksprungadresse vom Stack und l d sie in das Instruction Pointer Register IP so dass dort fortgesetzt wird Ein wichtiges Thema ist das Ver ndern von Registern durch Unterprogramme Es gibt verschie dene M glichkeiten damit umzugehen Unterprogramm ndert keine Register Die sichere Methode Alle im Unterprogramm be nutzten Register werden zu Beginn des Unterprogramms auf den Stack gerettet und vor dem Return Befehl wieder hergestellt Dabei werden allerdings auch die Register gesichert die im rufenden Programm gar nicht mehr gebraucht werden Dies verlangsamt das Pro gramm Register f r die Ergebnisr ckgabe m ssen ausgenommen werden Unterprogramm k mmert sich nicht um ver nderte Register Die intelligente Metho de Der Programmierer muss sich im rufenden Programm um die Rettung von Registe rinhalten k mmern allerdings nur wenn diese Register noch gebraucht werden Erfordert Aufmerksamkeit f hrt aber zu den schnellstm glichen Programmen Die richtige Wahl bei zeitkritischen Programmen CALL und RET sind also spezielle Sprungbefehle In einer 16 Bit Umgebung codiert der Assembler sie je nach Speichermodell als NEAR oder FAR 83 Registergruppen Dies ist ein Kompromiss aus den beiden ersten L sungen Ein Teil der Re gister darf frei im Unterprogramm ver ndert werden der Rest muss gesichert und wieder hergestellt werden In Hochsprachen verwendet Tips zum guten Stil Ein gutes Unterprogramm e erledigt
75. Rakakakakakakikikikikikk Abschnitt5 okk kkk kkk Programmende die Kontrolle muss explizit an DOS zurueckgegeben werden mov ah 04Ch ah 04C DOS Funktion terminate the program mov al 0 DOS Return Code O L sungen auf Seite 127 Kapitel 6 Bitverarbeitung 6 1 Bitweise logische Befehle Die Befehle dieser Gruppe arbeiten bitweise parallel Sie f hren die Operationen des logischen UND ODER und exclusiv ODER sowie der Invertierung zwischen zwei 8 16 oder 32 Bit Operanden durch Dabei werden die Bits des einen Operanden mit den entsprechenden Bits des anderen Operanden verknipft und das Ergebnis landet im ersten Operanden Die bitweise logischen Befehle setzen die Flags wie folgt ZF gesetzt wenn Ergebnis Null ist sonst gel scht SF gleich dem MSB des Ergebnis PF gesetzt wenn die Parit t des niederwertigen Byte gerade CF OF immer gleich NUll AND das logische UND Der AND Befehl verkn pft zwei Operanden bitweise entsprechend dem logischen UND Das Ergebnisbit ist gleich Eins wenn beide Operandenbits gleich eins sind sonst Null Die Operanden k nnen 8 16 oder 32 Bit haben und Register Speicher oder Direktoperanden sein Da das Ergebnis im ersten Operanden abgelegt wird kann dieser kein Direktoperand sein Ein Beispiel mov al 0C3h AL 11000011b and al 66h AND 01100110b Ergebnis AL 01000010b 42h Der AND Befehl ist n tzlich um ausgew hlte Bits eines Operanden zu l schen auf Null
76. T 0 in ST 3 ab und f hrt anschlie end ein pop durch Danach ist also das bisherige ST 3 aus dem Stapel entfernt Ein n tzlicher Befehl ist FXCH ST i der die Spitze des Stack ST 0 mit einem beliebigen Stackregister ST i austauscht Um vordefinierte Konstanten zu laden gibt es spezielle Ladebefehle Beispiele sind FLDZ L d eine Null in ST 0 FLD1 L d eine eins in ST 0 FLDPI L dr in ST 0 11 3 2 Kontrollbefehle Es gibt Kontrollbefehle um die FPU Exceptions zu steuern Steuer und Statuswort im Speicher abzulegen die Umgebung der FPU abzuspeichern oder zu laden den Stackpointer zu manipu lieren Register explizit freizugeben u a m Beispiele FINIT Software Reset der FPU FDECSTP Dekrement des Stackregister Pointer Top of Stack FINCSTP Inkrement des Stackregister Pointer Top of Stack FFREE Register f r frei d h ung ltig erkl ren ver ndert nicht den Stackpointer 11 3 3 Arithmetische Befehle Gleitkommarechnungen benutzen die Register des Registerstacks und z T auch Speicherope randen Das wichtigste Register ist ST 0 es ist an allen Gleitkommabefehlen beteiligt Es gibt auch die M glichkeit Speicheroperanden direkt in den Arithmetikbefehl einzubeziehen Nehmen wir als Beispiel die Addition es stehen folgende Varianten zur Verf gung FADD ST 0 ST Se ST 0 ST i FADD ST ST 0 ST ST 0 ST i FADDP ST ST 0 ST G an ST i pop stack FADD fp Variable ST 0 ST 0 fp Variable FIADD i
77. T Define Tenbyte 10 BCD Zahlen Bei der Definition kann gleichzeitig eine Initialisierung d h Vorbelegung vereinbart werden d h da der definierte Speicherplatz beim Programmstart einem gew nschten Wert vorbelegt wird Der Initialisierungswert kann dezimal hexadezimal oktal bin r oder als Character angegeben werden Bei Verzicht auf Initialisierung wird ein eingetragen 22 2 1 SPEICHERVARIABLEN DEFINIEREN 23 Die Syntax f r die Definition einer Einzelvariablen ist also Variablenname Define Direktive Wert Beispiele Zaehleri DB Def der Byte Variablen Zaehleri keine Vorbesetzung Zaehler2 DB 0 Def der Byte Variablen Zaehler2 Vorbesetzung mit 0 Endechar DB Auch Zeichen werden als Byte definiert Startchar DB 65 Vorbesetzung mit ASCII Zeichen 65 Ai Startchar DB A gleiche Wirkung besser lesbar Regmaske DB 00110101b Vorbesetzung mit bin rem Wert Bitmuster Pixelx DW Wort Variable ohne Vorbesetzung Pixely DW O1AFh Wort Variable Vorbesetzung mit hexadezimalem Wert Schluessel DD Doppelwort Speichervariable 32 Bit Quadratei DQ Quadword Variable zehnbytes DT Tenbyte Variable Mit einer Anweisung k nnen auch gleich mehrere Speicherpl tze gleichen Typs also Felder definiert werden Das geht auf zwei Arten 1 Durch die Angabe eines Zahlenwertes und das Wort DUP Duplizieren wobei die mit DUP angelegten Felder einheitlich initialisiert werden k nnen 2 durch Aufz hl
78. aeaa a na ans 153 16 12Prozessorkontrollbefehle 2 2 2 22 Con nn nn 154 Latar ehe 156 INHALTSVERZEICHNIS 7 Vorwort Das vorliegende Skriptum ist als Begleittext zur Vorlesung Maschinennahe Programmierung sp ter Systemprogrammierung I an der Fachhochschule Gie en Friedberg entstanden Es soll die H rer zumindest teilweise vom zeitraubenden Mitschreiben befreien und so die Vorstellung von mehr praktischen Beispielen erm glichen Der Hauptteil des Skriptums behandelt die As semblersprache der Intel Prozessoren der 80x86 Reihe Die Hardware dieser Prozessoren kann hier nur wird nur soweit besprochen wie es zum Verst ndnis der Programmierung erforderlich ist Das Skriptum soll und kann nur exemplarisch sein so sind z B nicht alle Befehle bespro chen Benutzen Sie daher erg nzend auch die einschl gige Literatur einige Titel sind am Ende aufgef hrt F r jede Art von Resonanz bin ich dankbar das gilt ebenso f r Verbesserungsvorschl ge und Fehlerhinweise wie f r positive Anmerkungen Gie en im M rz 2003 Klaus W st Klaus Wuest mni fh giessen de Kapitel 1 Einf hrung 1 1 Maschinencode und Assemblersprache Das Herz eines jeden Computers ist der Mikroprozessor Der Mikroprozessor kann Daten bearbeiten d h ver ndern sowie ber ein Leitungssystem Bus mit Speicher und Peripherie bausteinen austauschen F r die Verarbeitung der Daten verf gt er ber einige interne Spei cherpl tze die sog Register Register s
79. ahieren MOV AX word ptr dvar1 2 high Word von dvari nach AX SBB word ptr dvar2 2 AX von high Word von dvar2 subtrahieren dabei bertrag Carry subtrahieren 16 6 ARITHMETISCHE BEFEHLE 141 Compare CMP Vergleichen Syntax CMP Operand1 Operand2 Operandl reg8 16 32 mem8 16 32 Operand2 reg8 16 32 mem8 16 32 Direktoperand Flags OJ IS IZ JA P IC Beschreibung Operand2 wird von Operand1 subtrahiert die Flags werden wie bei SUB gesetzt aber Operand 1 bleibt unver ndert d h das Ergebnis wird weg geworfen Die Auswertung der gesetzten Flags erfolgt meist durch einen direkt nachfolgenden bedingten Sprungbefehl CMP arbeitet f r vorzeichenbe haftete und vorzeichenlose Zahlen korrekt Es k nnen nicht beide Ope randen Speicheroperanden sein Siehe auch SUB Beispiele Abbruch einer Z hlschleife mit CMP MOV CX 0 AX b Li CALL Unterprog Schleifenrumpf INC CX CMP CX 10 CX 10 JNE L1 Wenn nicht Schleife fortsetzen Multiplication MUL Multiplikation Syntax MUL Multiplikator Multiplikator reg8 16 32 mem8 16 32 Flags O C Beschreibung MUL f hrt eine Multiplikation vorzeichenloser Zahlen durch Im Befehl ist als Operand explizit nur der Multiplikator genannt der Multiplikand ist immer AL bzw AX Je nach Bitbreite des Multiplikators wird eine Byte Wort oder Doppelwort Multiplikation durchgef hrt Bei der Byte Mult
80. ahlen wird DIV benutzt f r die Division vorzeichenbehafteter Zahlen IDIV Man unterscheidet Byte Wort und Doppelwortdivision der Operand Divisor bestimmt die Art der Division 8 4 DIVISION 73 Bezeichnung Dividend Divisor Ergebnis Rest Bytedivision 16 Bit AX 8 Bit Operand 8 Bit AL 8 Bit AH Wortdivision 32 Bit DX AX 16 Bit Operand 16 Bit AX 16 Bit DX Doppelwortdivision 64 Bit EDX EAX 32 Bit Operand 32 Bit EAX 32 Bit EDX Byte Division Syntax DIV IDIV reg8 mem8 Der Inhalt des Reg AX wird durch den Operanden geteilt das Ergebnis wird in AL abgelegt der Rest in AH Beispiel div bl dividiert ax durch bl Ergenis in al Rest in ah Wort Division Syntax DIV IDIV reg16 mem16 Dividiert den Inhalt von DX AX durch den Operanden Ergebnis wird in AX abgelegt Rest in DX Beispiel idiv word ptr di dividiert dx ax durch 16 Bit Speichervar Ergebnis in ax Rest in dx vorzeichenrichtig Doppelwort Division Syntax DIV IDIV reg32 mem32 Dividiert den Inhalt von EDX EAX durch den Operanden Ergebnis wird in EAX abgelegt Rest in EDX Beispiel idiv ebx dividiert edx eax durch ebx Ergebnis in eax Rest in edx ohne Vorzeichen In den folgenden Beispielen soll noch einmal die Entstehung von Divisionsfehlern verdeutlicht werden 1 Beispiel zu berechnen 823 4 mov ax 823 mov b1 4 div bl Ergebnisse 5 al 205 ah 3 mov ax 823 mov bl 2 div bl
81. auscht werden Ohne den XCHG Befehl brauchte man dazu drei MOV Befehle mov ebx eax mov eax edx mov edx ebx Diese L sung h tte ausserdem den unerw nschten Nebeneffekt der Ver nderung des Hilfsregi sters EBX 3 3 Daten in gr ere Register transportieren Es kommt oft vor dass Daten in ein Zielregister transportiert werden m ssen das mehr Bit hat als der Operand Nehmen wir z B den Fall dass eine vorzeichenlose 8 Bit Zahl aus dem 40 KAPITEL 3 DATEN TRANSPORTIEREN Register dl in das Register AX bertragen werden soll Der Befehl mov az dl f hrt nur zu einer Fehlermeldung Es ist ja unklar auf welche 8 Bit im Zielregister AX geschrieben werden soll Man k nnte sich nun z B entscheiden auf die niederwertigen 8 Bit zu schreiben dies m te dann mit mov al dl geschehen Dann kann aber in AH noch ein Bitmuster stehen und der Inhalt von AX w rde dann eine ganz andere Zahl repr sentieren Man muss also zus tzlich die h herwertigen 8 Bit mit Null beschreiben mov al dl mov ah 0 Bei der bertragung eines 8 Bit Wertes in ein 32 Bit Register w rde man wie folgt vorgehen mov eax 0 mov al dl Es gibt nun einen Spezialbefehl der diese bertragung in einem Schritt durchf hrt MOVZX Move and extend Zero Sign also Transportiere und erweitere mit Null Bits Die obigen Operationen k nnten also jeweils in einem Schritt durchgef hrt werden movzx ax dl beziehungsweise movzx eax dl Komplizierter wird die Situat
82. befehle sind in Assemblersprache von elementarer Bedeutung weil Verzweigungen und Wiederholungen mit Sprungbefehlen realisiert werden Man unterscheidet unbedingte Sprung befehle bedingte Sprungbefehle und Unterprogrammaufrufe letztere werden in einem eigenen Kapitel behandelt 7 1 Unbedingter Sprungbefehl JMP Mit dem Befehl JMP Jump Springe wird ein unbedingter Sprung ausgef hrt Die Syntax ist JMP Sprungziel Das Sprungziel ist in der Regel eine Marke die irgendwo im Programm erkl rt ist Beispiel Lese_neues_Zeichen jmp Lese_neues_zeichen direkter unbedingter Sprung Man spricht in diesem Fall auch vom direkten Sprung Seltener wird der indirekte Sprung verwendet bei dem das Sprungziel in einem Register oder sogar einem Speicherplatz liegt Beispiel mov ax offset Sprungmarke5 jmp ax indirekter unbedingter Sprung Aus der Sicht des Programmierers braucht f r unbedingte Spr nge immer nur der Befehl jmp ver wendet werden Auf Maschinencode Ebene werden dagegen die Sprungbefehle nach der Sprung weite weiter unterschieden 58 7 2 BEDINGTE SPRUNGBEFEHLE 59 Entfernung des Sprungzieles Bezeichnung Befehlsl nge im Maschinencode 128 127 Byte SHORT JUMP 1 Byte OpCode 1 Byte rel Entfernung im gleichen Segment NEAR JUMP 1 Byte OpCode 2 Byte NEAR Zeiger anderes Segment FAR JUMP 1 Byte OpCode 4 Byte FAR Zeiger F r die SHORT JUMP s ist die Sprungweite relativ codiert O bed
83. bei zeigen die Intel Prozessoren eine interessante und verwirrende Eigenart Sie speichern Daten im sogenannten Little Endian Format Dabei gilt das Prinzip Lowest Byte first alle Darstellungen von Zahlen werden in Bytes zerlegt und diese Bytes werden beginnend mit dem niedrigstwertigen Byte im Speicher abgelegt Die Zahl 120h in 16 Bit Darstellung steht also im Register als 0120h und im Speicher als 20h 01h Die 32 Bit Zahl 01304263h liegt im Speicher als 63h 42h 30h 01h Zum Gl ck erledigt der Prozessor die Arbeit des Umdrehens Er verdreht die Reihenfolge der Bytes beim Ablegen in den Speicher und bringt sie beim Zur ckholen ins Register wieder in die richtige Ordnung Als Assemblerprogrammierer muss man Little Endian nur kennen falls man einmal einen Speicherdump auswertet oder auf die genauen Byte Positionen Bezug nimmt Beispiel Bytevar DB 90h Wordvar DW 4501h Dwordvar DD 12345678h Stringvar DB ABCDEFGH 13 10 Die Variablen werden wie folgt im Speicher abgelegt 90 O1 45 78 56 34 12 41 42 43 44 45 46 47 48 OD OA 24 Ein wichtiger Begriff ist der sog Offset Dies bedeutet soviel wie Abstand vom Segmentanfang oder relative Adresse im Datensegment So hat zum Beispiel die erste Variable in unserem Bei spiel Bytevar den Offset 0 Da Bytevar nur ein Byte belegt hat Wordvar den Offset 1 Wordvar belegt 2 Byte also hat die n
84. ber BP adressiert Nach dem R cksprung in die rufende Funktion m ssen dort die Parameter wieder vom Stack entfernt werden F r die Speichermodelle TINY SMALL und COMPACT ergibt sich also w hrend der Ausf hrung eines Unterprogramms folgender Stackaufbau Adresse Inhalt BP 10 BP 8 A BP 6 zweites Parameterwort BP 4 erstes Parameterwort BP 2 R cksprungadresse BP geretteter BP BP 2 erstes Wort der lokalen Variablen BP 4 zweites Wort der lokalen Variablen BP 6 drittes Wort der lokalen Variablen BP 8 BP 10 13 6 EINBINDUNG VON ASSEMBLERCODE IN C C PROGRAMME F r die Speichermodelle MEDIUM LARGE und HUGE ergibt sich folgender Stackaufbau Inhalt zweites Parameterwort erstes Parameterwort R cksprungadresse R cksprungadresse geretteter BP Adresse BP 12 BP 10 BP 8 BP 6 BP 4 BP 2 BP BP 2 BP 4 BP 6 BP 8 BP 10 erstes Wort der lokalen Variablen zweites Wort der lokalen Variablen drittes Wort der lokalen Variablen 117 Kapitel 14 Assemblerpraxis 14 1 Der Zeichensatz Wir beziehen uns hier auf den ASCII Zeichensatz Es handelt sich dabei um einen 7 Bit Zeichensatz d h bei Benutzung von 8 Bit Einheiten ist das MSB immer Null Dieser ist in Steuerzeichen und darstellbare Zeichen aufgeteilt Die ersten 32 Zeichen 0 31 0 1Ah sind die Steuerzeichen mit Ihnen kann z B die Position des Cur
85. bereitung inc Haeufigkeit bx indirekte Adressierung wird nun auch das Feldelement Nr 3 angesprochen hier kann man aber zur Laufzeit berechnen welcher Speicherplatz angesprochen wird Die indirekte Adressierung bietet die M glichkeit den Offset zur Laufzeit flexibel zu berechnen und zwar als Summe aus dem Inhalt eines Basisregisters BX oder BP dem eines Indexregisters DI oder SI und beliebig vielen Konstanten Die Konstanten k nnen auch Variablennamen sein Die allgemeine Form der indirekten Adressierung in 16 Bit Umgebungen ist Basisregister Indexregister Konstanten Es d rfen auch ein oder zwei Anteile entfallen Wenn nur eine Konstante in den Klammern steht ergibt sich eine direkte Adressierung Die eckigen Klammern sind Pflicht Die m glichen Varianten sind also BX BX Konstante BP BP Konstante DI DI Konstante SI SI Konstante BX DI BX DI Konstante BX SI BX SI Konstante BP DI BP DI Konstante BP SI BP SI Konstante Konstante Stehen innerhalb der eckigen Klammern mehrere Konstante so werden sie schon bei der ber setzung vom Assembler zusammengefasst Beispiel inc 1 Haeufigkeit 30 5 wird bei der bersetzung zu inc Haeufigkeit 36 Eine wichtige Frage ist In welchem Segment wird zugegriffen Dies ist durch die Bauart des Prozessors festgelegt Es gilt 32 KAPITEL 2 ORGANISATION UND BENUTZUNG DES HAUPTSPEICHERS
86. bt es n tzliche Men s 14 4 Ein Rahmenprogramm Bei Verwendung des Borland Assemblers und der sog vereinfachten Segmentanweisungen kann z B folgender Rahmen f r vollst ndige Programme benutzt werden Titel des Programmes DOSSEG MODEL Small moegl sind Tiny Small Medium Compact Large Huge STACK 256 Stackgroesse 256 Byte max moeglich sind 64 kB EQU und Direktiven hier einfuegen DATA Reservierung von Speicherplatz und Zuordnung von Namen fuer Variable bytevariablel DB nicht initialisiertes Byte Wortvariablel DW O initialisierte Wortvariable Feldi DW 10 DUP O 10 Worte mit dem Wert Null initialisiert Initialisierter String titel DB Programmtitel MUSTER ASM 13 10 CODE Programmstart Label haben einen Doppelpunkt am Ende mov ax data Uebergabe der Adresse des Datensegments zur Laufzeit mov ds ax DS zeigt nun auf das Datensegment 124 KAPITEL 14 ASSEMBLERPRAXIS mov ah 9 DOS Funktion print string mov dx OFFSET titel Adresse von titel int 21h Veberschrift ausgeben eigentliches Programm Programmende Kontrolle explizit an DOS zurueckgeben EXIT mov ah 04Ch ah 04C DOS Funktion Terminate the program mov al 0 DOS Return Code O int 21h Interrupt 21h Aufruf von DOS Unterprogramme z B hier einfuegen auch mit Include Anweisungen END Programmstart Kapitel 15 L sungen zu den Testfragen L sungen zu den Fragen aus Abschnit
87. bx Kopie von bx anlegen shl bx 4 bx bx 16 add bx si bx bxx 17 mov di cx Kopie von cx anlegen shl cx 3 CX CX 8 add cx di CX CX 9 add bx cx bx 17 bx 9x cx mov ax bx Ergebnis nach ax 5 Loesungl not bx invertieren shr bx 7 shift right bx 7 Bit 7 ist jetzt LSB es geht auch rol bl 1 and bx 1 LSB stehen lassen restliche Bits 0 setzen add ax bx addieren Loesung2 shl bx 8 shift left bx 8 Bit 7 ist jetzt MSB shr bx 15 Bit 7 ist jetzt LSB andere Bits sind O xor bx 1 add ax bx addieren Loesung3 shl bx 9 shift left bx 9 Bit 7 jetzt im Carryflag mov bx 0 Bit 7 ist jetzt LSB andere Bits sind O rcl bx 1 rotate through carry left CF in LSB von BX add ax bx addieren 129 L sungen zu den Fragen aus Abschnitt Sprungbefehle Abschnitt 7 5 1 Erg nzen Sie in dem folgenden Programmst ck die fehlenden Befehle oder Operanden Ausgabe der Ziffern von 9 abw rts bis 0 mov dl 9 lt oder z B mov d1 39h Schleifenstart mov ah 2 DOS Funktion Zeichenausgabe int 21h dec dl lt cmp d1 0 lt oder z B mov d1 30h jae Schleifenstart 2 AX 10h 3 Finden Sie die Fehler in dem folgenden Programmst ck Belegen eines Wortfeldes mit dem Wert O DATA Feld DW 20 DUP CODE mov bx 1 Falsch Richtig ist mov bx 0 Schleifenstart mov Feld bx 0 inc bx Falsch Richtig ist add bx 2 cmp bx 20 Falsch Ri
88. chirm ausgeben Vor Aufruf AH 2 DL auszugebendes Zeichen Nach Aufruf DOS INT21h Funktion 4Eh Finde ersten passenden Verzeichniseintrag 5 4 TESTFRAGEN 49 Vor Aufruf AH 4Eh DS DX Zeiger auf den Offset eines ASCIIZ Strings mit der Verzeichnis bzw Suchmaske hier ASM 0 CX Attribute hier 0 Nach Aufruf AX 0 wenn fehlerfrei AX Fehlercode wenn Fehler z B keine passenden Eintr ge CF 1 wenn Fehler DOS INT21 h Funktion 4Fh Finde weiteren passenden Verzeichniseintrag Vor Aufruf AH 4Fh Nach Aufruf AX 0 wenn fehlerfrei AX Fehlercode wenn Fehler z B keine weiteren Eintr ge CF 1 wenn Fehler DOS INT21h Funktion 2Fh Ermittle DTA Adresse Vor Aufruf AH 2Fh Nach Aufruf BX Offset des Zeigers auf die DTA ES Segment des Zeigers auf die DTA DOS INT21h Funktion 30h DOS Versionsnummer ermitteln Vor Aufruf AH 30h Nach Aufruf AL Hauptversionsnummer AH Nebenversionsnummer DOS INT21h Funktion 36h Ermittlung der Diskettenkapazit t Vor Aufruf AH 36h DL logische Laufwerksnummer A 1 B 2 usw Nach Aufruf AX Sektoren pro Cluster BX Anzahl der freien Cluster CX Anzahl der Bytes pro Sektor DX Anzahl der Cluster insgesamt BIOS INT 16h Funktion AH 02h Tastatur Flags ermitteln Vor Aufruf AH 02h Nach Aufruf AH reserviert
89. chtig ist cmp bx 40 je Schleifenstart Falsch Richtig ist jne oder jb Schleifenstart L sungen zu den Fragen zu arithmetischen Befehlen Abschnitt 8 7 1 Alle Befehle sind fehlerhaft add ax 2 0Operand fehlt adc bx ax cf ein Operand zuviel CF als Operand nie erlaubt mul eax ebx MUL hat nur einen Operanden mul 80h Direktoperand nur bei IMUL erlaubt imul ax bx cx IMUL hat als dritten Operanden nur Direktwerte idiv edx eax IDIV hat nur einen Operanden 2 AX 2000h BX 0300h CX FF90h 70 DX 0050h DI 0100h 3 AX 80h CX 100h 130 KAPITEL 15 L SUNGEN ZU DEN TESTFRAGEN 4 AX 0550h DX 0000h 5 Berechnung von 123456h 11h mov eax 123456h mov ebx 11h div ebx Dieser Programmabschnitt kann leicht zu einem Divisionsfehler f hren da EDX nicht mit 0 vorbesetzt ist L sungen zu den Fragen aus Abschnitt Stack Abschnitt 9 4 1 Nur der zweite Auf dem Stack gibt es keine 8 Bit Operationen 2 ax 10 bx 9 cx 8 3 Die Schleife mit dem PUSH Befehl wird 10 mal ausgef hrt die Schleife mit dem POP Befehl 11 mal Der Stack ist also nicht ausbalanciert Kapitel 16 Assemblerbefehle nach Gruppen 16 1 Allgemeines In diesem Kapitel sind die wichtigsten Befehle nach Gruppen zusammengefa t und beschrie ben Ausgenommen sind z B die Befehle der Gleitkommaeinheit und der MMX Einheit Eine vollst ndige Befehlsreferenz findet man z B in den Datenbl ttern der Prozessorhersteller intel und AMD Zu
90. das Carryflag CF 1 CF Beispiele fehler STC Fehlerfall Riickgabe der Information im Carry RET ok CLC kein Fehler RET Literaturverzeichnis E 10 11 12 Aktuelle Titel R Backer Programmiersprache Assembler rororo 1993 Eine strukturierte Einf hrung Podschun Das Assemblerbuch Addison Wesley 1999 Umfangreiches und anspruchsvolles Werk enth lt ein eigenes Assembler Entwicklungssystem Rohde J Assembler ge packt mitp Verlag Bonn 2001 Kompaktes Nachschlagewerk enth lt auch MMX SSE und SSE2 Befehle E W Dieterich Turbo Assembler Oldenbourg 1999 Systematische Einf hrung einschlie lich der Schnittstellen zu Pascal und C W Link Assembler Programmierung Franzis 2000 M ller Oliver Assembler Referenz FRANZIS Verlag 2000 Erdweg J Assembler Programmierung mit dem PC Vieweg 1992 Kurzgefasstes aber systematisches Einf hrungswerk ltere Titel T Swan Mastering Turbo Assembler Hayden Books 1989 Ausgezeichnetes gut lesbares und umfangreiches englischsprachiges Werk P Hei PC Assemblerkurs Heise 1994 Einf hrung in Kursform an Themen orientiert u a VGA Programmierung BIOS DOS EMS XMS u a m T Swan Mastering Turbo Assembler Hayden Books 1989 Ausgezeichnetes gut lesbares und umfangreiches englischsprachiges Werk D Bradley Programmieren in Assembler Hanser 1984 86 Veraltet nur 8086 88 aber gut verst ndlich Autor ist absoluter Insider Letzel
91. de CS IP Bei Zugriff auf Daten i d R DS Alle Befehle die den Stack benutzen CALL RET RETI PUSH POP sowie Zugriffe mit Adressierung ber BP SS Zieloperand bei Stringbefehlen ES Soll ein anderes Segmentregister benutzt werden muss dies im Befehl ausdr cklich ange geben werden Segment Override mov ax bx 10 Default Segmentregister DS wird benutzt Speicherzelle DS BX 10 nach Register AX laden mov ax ES bx 10 Speicherzelle ES BX 10 nach Register AX laden Diese Speicherorganisation hat f r die Programmierung nat rlich Konsequenzen Adressen die innerhalb des Segments liegen NEAR sind durch Einsetzen des richtigen Offsets bequem zu erreichen Wenn ich also in einem Programm einen Datenbereich von bis zu 64 kB habe passt alles in ein Segment alle Variablen k nnen ohne Ver nderung des Segmentregisters erreicht werden F r die Angabe einer Adresse gen gt dann der Offsetanteil In Hochsprachen werden Adressen meist als Zeiger oder Pointer bezeichnet Zeiger die nur den Offset beinhalten hei en NEAR Zeiger bzw NEAR Pointer Adressen ausserhalb des Segments machen mehr Umst nde Das Segmentregister muss vor dem Speicherzugriff umgesetzt werden Verwaltet man also eine Datenmenge von mehr als 64 kB so muss f r jede Adresse Segment und Offset angegeben werden Jedesmal wenn eine Adresse gespeichert oder geladen wird m ssen also zwei Anteile behandelt werden Das macht die Pro gramme nun umst ndlicher und langsa
92. e Bildung des Absolutbetrages im folgenden Codeabschnitt Bildung des Absolutbetrages von eax cmp jge neg fertig eax 0 fertig eax 8 6 Beispiel In einem abschliefenden Beispiel soll ein arithmetischer Ausdruck in Assembler berechnet wer den 8 7 TESTFRAGEN 75 Berechnung von 5 2 A Bx C Alle Variablen haben 32 Bit und es wird vorausgesetzt dass das Ergebnis ebenfalls mit 32 Bit darstellbar ist mov eax A imul eax 2 eax 2x A mov ebx B imul ebx C ebx BxC add eax ebx eax 2 A B C mov ecx D sub ecx E ecx D E mov edx 0 Vorbereitung Division idiv ecx eax 2 A B C D E mov X eax zuweisen an x Rest in edx Verwendung beliebig 8 7 Testfragen 1 add ax adc bx ax cf mul eax ebx mul 80h imul ax bx cx div edx eax Finden Sie die syntaktisch fehlerhaften Befehle 2 Bestimmen Sie welchen Inhalt die Register AX BX CX DX und DI nach der Ausf hrung der folgenden Befehle haben mov cx 20h sub cx 90h mov dx 90h add dx cx mov ax 50h mov di 100h div di imul bx di 3 3 Bestimmen Sie welchen Inhalt die Register AX und CX nach der Ausf hrung der folgen den Befehle haben 76 KAPITEL 8 ARITHMETISCHE BEFEHLE mov cx 20h imul cx 2 imul ax cx 2 imul cx ax 2 4 Bestimmen Sie welchen Inhalt die Register AX BX und DX nach der Ausf hrung der folgenden Befehle haben mov dx 50h mov ax 5h mov bx 100h div bx div bx 5 Berechnung von
93. e Speicherzelle Man beachte dass die Adressierungen mit BP bewusst vermieden wurden da dies den Stack adressieren w rde Die indirekte Adressierung gibt uns also die M glichkeit den Inhalt eines Registers als variablen Zeiger in Speicher zu benutzen Wichtig Variable Zeiger lassen sich nur mit Registern realisieren 2 4 ADRESSIERUNGSARTEN 33 Eine Konstruktion ber Speichervariable die als Zeiger wirken sollen ist nicht m glich Beispiel DATA Zeichenkette DB ABCDEfGH Zeiger DW CODE mov ax Cdata mov da az mov Geiger offset zeichenkette Offset von zeichenkette in zeiger mov zeiger 5 F ACHTUNG FEHLER Dieses Programmst ck wird klaglos bersetzt funktioniert aber nicht so wie es gedacht war Bei der bersetzung wird f r den Bezeichner zeiger der Offset dieser Variablen eingesetzt 8 in der eckigen Klammer steht also der konstante Ausdruck 8 5 also wird in dieser Zeile fest Speicherzelle 13 adressiert Typoperatoren Ein Problem bleibt noch Der 8086 kann bei einem Speicherzugriff 8 Bit ansprechen Bytezugriff oder 16 Bit Wortzugriff Der 386 kann sogar in einem Schritt auf ein Doppelwort mit 32 Bit zugreifen Wenn der Speicher nun unter Verwendung eines Variablennamens adressiert wird ist durch die Definition der Variablen die Art des Zugriffs festgelegt Wird dagegen ein Registerinhalt als Adresse benutzt ist evtl der Assembler nicht in der Lage die Art des Zugriffs zu bestim
94. egment einen Sinn ergibt Eine weitere sehr n tzliche Sache ist die sog Index Skalierung Dabei kann der Inhalt des verwendeten Indexregisters bei der Adressierung mit den Faktoren 2 4 oder 8 multipliziert werden Dazu wird innerhalb der eckigen Klammern 2 4 oder 8 hinzugef gt Dies ist sehr praktisch bei der Adressierung von Wort oder Doppelwortfeldern bei denen jedes Feldelement 2 bzw 4 Byte belegt Zum Beispiel ersetzt der Befehl mov AX Wortfeld ecx 2 die Befehlsfolge shl ecx 1 mov AT Wortfeld ecx shr ecx 1 Man muss allerdings darauf achten dass 16 Bit und 32 Bit Adressierung nicht ohne weiteres gemischt werden d rfen In einem 32 Bit Code m ssen alle Adressen immer 32 Bit umfassen z B ebx Im 16 Bit Code m ssen immer 16 Bit Adressen verwendet werden z B esi 2 5 Testfragen 1 berlegen Sie ob die folgenden Befehle korrekt sind DATA Zaehleri DB Zaehler2 DB 0 Endechar DB Startchar DB A KAPITEL 2 ORGANISATION UND BENUTZUNG DES HAUPTSPEICHERS Pixelx DW Pixely DW O1FFh Schluessel DD 1200h CODE mov Zaehleri 100h mov Zaehler2 ax mov ah 2 mov dx Startchar int 21h movzx Endechar Q mov edx Startchar xchg Pixely cx mov schluessel ebp A mov Pixelx Pixely 5 2 berlegen Sie welche der folgenden Befehle zu Fehlermeldungen Warnungen oder Lauf zeitfehlern f hren DATA Feld DB 25 DUP 0 zahl DW O CODE 386 mov Feld cx al mov
95. ehle 59 Befehlssatz 8 Betriebssystemaufruf 44 BIOS 44 bsf 56 138 bsr 56 138 bt 56 138 btc 56 138 btr 56 138 bts 56 138 Byte 13 120 call 146 Carryflag 66 clc 155 cld 154 cli 154 cmc 155 cmp 141 cmpsb 150 cmpsd 150 cmpsw 150 darstellbare Zeichen 118 dec 139 Dezimalsystem 66 direkten Sprung 58 Direktiven 19 158 div 143 Divisionsergebnis 72 Divisionsfehler 72 Divisionsrest 72 DOS 44 Eingabe 43 Eingabebaustein 43 FAR Pointer 27 FAR Zeiger 27 Felder 23 flaches Speichermodell 29 Flag 16 Flie kommazahlen 66 ganze Zahlen 66 gepackte Daten 89 1 O Portadressen 43 I O Ports 43 idiv 143 imul 142 IN 43 in 43 152 inc 139 Index Skalierung 35 indirekte Adressierung 31 indirekte Sprung 58 Initialisierung 22 Input 43 int 147 Interrupt 45 Interrupt Vektoren Tabelle 45 JA 145 JAE 145 JB 145 JBE 145 JC 145 jexz 63 146 JE 145 INDEX jecxz 63 JG 145 JGE 145 JL 145 JLE 145 jmp 144 JNA 145 JNAE 145 JNB 145 JNBE 145 JNC 145 JNE 145 JNG 145 JNGE 145 JNL 145 JNLE 145 JNO 145 JNP 145 JNS 145 JNZ 145 JO 145 JP 145 JPE 145 JPO 145 JS 145 JZ 145 Least significant Bit 13 least significant bit 120 Linker 20 Little Endian Format 24 lodsb 149 lodsd 149 lodsw 149 logische Adresse 26 loop 63 153 loope 63 153 loopne 63 153 loopnz 63 153 loopz
96. eibenden h herwertigen Bits mit Nullen auf MOVSX f llt die frei bleibenden h herwertigen Bits vorzeichenrichtig auf d h je nach Vorzeichen mit 0 oder 1 Beispiele MOVZX EAX DL MOVSX DX CL SET if cc Elo Bedingtes Setzen Syntax SETcc Operand Operand reg8 mem8 Flags Beschreibung Schreibt in den Operanden Ziel eine 1 als 8 Bit Wert wenn die mit xx beschriebene Bedingung erf llt ist und schreibt eine 0 wenn nicht Die durch cc Conditions angedeuteteten m glichen Bedingungen sind die gleichen wie beim bedingten Sprungbefehl Jcc Beispiele SETZ CL Olh in cl wenn Zeroflag gesetzt sonst 00h in cl SETGE var8 Oih in var8 wenn Gr er gleich Bedingungerf llt jne usw sonst eine 00h 16 3 Logische Befehle NOT NOT Negation Syntax NOT Operand Operand reg8 16 32 mem8 16 32 Flags Beschreibung F hrt eine bitweise Negation des Operanden aus d h 0 1 und 1 gt 0 16 3 LOGISCHE BEFEHLE 135 Beispiele MOV mask 11110011b NOT mask mask hat jetzt den Wert 00001100b d h 12 logical AND OR exclusive OR AND X 6 OR OR logisches UND ODER exklusives ODER Syntax AND OR XOR Zieloperand Operand2 Zieloperand reg8 16 32 mem8 16 32 Operand2 reg8 16 32 mem8 16 32 Direktoperand Flags OJ IS IZ IPI 1C Hiervon werden OF und CF immer gel scht Beschreibung Diese Befehle f hren bitweise logische Operationen zwischen Zieloperand u
97. eine Aufgabe und nur eine e ist so kurz wie m glich und so lang wie n tig z B max 100 Zeilen e beginnt mit Kommentaren Aufgabe des Unterprogrammes bergabe der Parameter ver nderte Register Anmerkungen des Bearbeiters e kann alleinstehend bersetzt und verstanden werden e hat einen treffenden Namen Kapitel 11 Die Gleitkommaeinheit Die Gleitkommaeinheit engl floating point unit FPU ist eine relativ eigenst ndige Verarbei tungseinheit des Prozessors Sie verf gt ber einen eigenen Befehlssatz und eigene Register und sie kann parallel zum Hauptprozessor arbeiten Die SSE Verarbeitungseinheiten ab Pentium III k nnen mehrere Gleitkommazahlen parallel verarbeiten 11 1 Gleitkommazahlen Die Gleitkommaeinheit unterst tzt drei Gleitkommaformate die in Abb 11 1 dargestellt sind Intern wird immer im 80 Bit Format gerechnet die anderen Formate werden beim Laden in den Gleitkommastack in dieses Format umgewandelt Alle Gleitkommaformate bestehen aus den Anteilen Vorzeichen Exponent und Mantisse 79 Double extended Precision floating point 80 Bit 0 E10 Eo m1 M52 63 Double Precision floating point 64 Bit o 31 0 Single Precision floating point 32 Bit Abbildung 11 1 Die unterst tzten Gleitkommaformate 11 2 Aufbau der Gleitkommaeinheit 11 2 1 Die Register der Gleitkommaeinheit Es gibt 8 Datenregister R1 bis R8 zu je 80 Bit in denen die zu verarbeitenden Zahlen liegen und in denen auch die Ergebnisse abge
98. eines 16 Bit Wertes aus BX in das h herwertige Wort von EAX mov ax bx shl eax 16 2 Schnelle Multiplikation des Wertes in AX mit 9 mov bx ax Kopie anlegen sal ax 3 ax ax 8 add ax bx ax ax 9 Der Geschwindigkeitsvorteil bei Multiplikation durch Schiebebefehle gegen ber dem IMUL Befehl h ngt vom Prozessortyp ab und muss im Einzelfall anhand der n tigen Taktzyklen nachgerechnet werden 56 KAPITEL 6 BITVERARBEITUNG 3 Entnehmen eines Zahlenwertes auf einem Bitfeld innerhalb eines Bytes 6 3 Finzelbit Befehle Ab dem 80386 Prozessor gibt es spezielle Befehle um einzelne Bits abzufragen oder zu ndern Bei diesen Befehlen ist es nicht mehr n tig mit Masken zu arbeiten um auf einzelne Bits zuzugreifen BT Bits testen Mit dem Befehl BT wird ein einzelnes Bit eines Register oder Speicheroperanden in das Car ryflag bertragen Im folgenden Beispiel wird Bit 3 von EDX getestet bt edx 3 Bit 3 ins CF bertragen je bit3gesetzt Auswertung des Bits durch bedingten Sprung Es gibt drei Varianten des BT Befehls der zus tzlich das getestete Bits anschlie end ver ndert BTS Bit Test and Set Setzt das getestete Bit auf 1 BTR Bit Test and Reset Setzt das getestete Bit auf 0 BTC Bit Test and Complement Komplementiert invertier das getestete Bit BSF und BSR 1 Bits suchen Mit den Befehlen BSF Bit search forward und BSR Bit search reverse wird in einem Operan den das erste 1 Bit gesucht BSF
99. en Im folgenden Abschnitt sollen nun zuerst diese beiden Zahlenformate erkl rt werden 8 1 Die Darstellung von ganzen Zahlen Ein Mikroprozessorsystem verarbeitet immer Bitmuster in Einheiten zu 8 16 32 oder mehr Bit Erst durch die Art der Verarbeitung wird diesem Bitmuster eine bestimmte Bedeutung zugewiesen Wende ich z B einen arithmetischen Maschinenbefehl auf ein Bitmuster an so wird es als Zahl interpretiert eine Ausgabe auf den Bildschirm interpretiert das gleiche Bitmuster dagegen als darstellbares Zeichen des aktuellen Zeichensatzes Betrachten wir ein Beispiel Ein Byte habe den Inhalt 01000011b 43h 67d Dies kann interpretiert werden als e ASCII Zeichen C e Vorzeichenlose oder vorzeichenbehaftete 8 Bit Zahl 67d 43h e als Maschinenbefehl e Bitmuster um die Interrupts 0 1 und 6 freizugeben Wir wollen hier die Interpretation von Bitmustern als Zeichen und ganze Zahlen betrachten F r die Ausgabe auf einen Bildschirm oder Drucker muss ein definierter Vorrat an Buchsta ben Ziffern und sonstigen Zeichen verf gbar sein der Zeichensatz Es sind verschiedene Zei chens tze in Gebrauch z B der ASCII Zeichensatz American Standard Code for Information 65 66 KAPITEL 8 ARITHMETISCHE BEFEHLE Interchange Da im ASCII Zeichensatz jedes Zeichen mit 7 Bit verschl sselt ist enth lt er 128 Zeichen Die ersten 32 Zeichen sind Steuerzeichen wie z B Wagenr cklauf Zeilenvorschub Ta bulator u a m Es gibt auch
100. en und Doppelwor ten zu Quadworten 64 Bit Bitweise logische Befehle Logisches UND UND NICHT ODER und exklusives ODER auf 64 Bit Operanden Schiebebefehle Schieben der gepackten Worte Doppelworte oder Quadwortes ganzes 64 Bit Register nach links oder rechts Datentransport Bewegen eines Doppelwortes zwischen MMX Einheit und Speicher Allzweckregister und Bewegen eines Quadwortes zwischen MMX Einheit und Speicher EMMS Beenden der Multimediaoperationen und Leeren der MMX Register Kapitel 13 Die Schnittstelle zwischen Assembler und C C 13 1 bersicht Man verwendet Assembler in C C oder anderen Hochsprachen aus zwei Griinden Geschwindigkeitsgewinn H ufig durchlaufene Codeabschnitte k nnen zeitkritischen sein z B der Kern eines MP3 Dekoders oder eines Spieles Es gibt Hilfsmittel um zeitkritische Ab schnitte zu identifizieren Dort kann es sich lohnen Assembler einzusetzen Man w rde das Programm zun chst in C C schreiben und dann die wichtigsten Stellen so sparsam wie m glich z B 2 durch Assemblercode ersetzen Die urspr nglichen C C Befehle sollten als Kommentar stehen bleiben Nachteile Portabilit t geht verloren Wartung wird schwierger Lesbarkeit schlechter Vollst ndiger Zugriff auf Prozessor und Hardware Mit Assembler k nnen z B Flags ma nipuliert oder Stringbefehle erzwungen werden Auch die Prozessorkontrollbefehle f r den Protected Mode k nnen nur in Assembler eingef gt werden Pra
101. er SF OF JG JNLE greater not less or equal gr er SF OF und ZF 0 Vorzeichenlose Arithmetik JAJJNBE abovelnot below or equal oberhalb CF 0 und ZF 0 JB JNAE below not above or eq unterhalb CF 1 JNA JBE not above below or equal nicht oberhalb CF 1 oder ZF 1 JNB JAE not below above or equal nicht oberhalb CF 0 Jump if CX Zero JCXZ Springen wenn CX 0 Syntax JCXZ Ziel Ziel label short Flags Beschreibung F hrt einen Sprung zum angegebenen Sprunglabel Short Jump durch wenn CX 0 ist Dieser Befehl ist in Verbindung mit den LOOPXX Befehlen n tzlich Er kann benutzt werden um zu erreichen dass eine LOOPXX Schleife bersprungen wird wenn CX 0 Beispiele Siehe LOOPNE CALL CALL Rufen Syntax CALL Ziel Ziel Unterprogrammadresse Flags 16 8 PROGRAMMFLUSS STEUERUNGSBEFEHLE 147 Beschreibung Beispiele 5 S Legt zun chst die Adresse des n chstfolgenden Befehls auf den Stack PUSH und springt dann zu der angebenen Startadresse des gerufenen Unterprogramms Das Programm wird also dort fortgesetzt Wenn im Unterprogramm ein RET ausgef hrt wird wird die R cksprungadresse vom Stack geholt und das Programm mit dem n chsten Befehl nach CALL fortgesetzt Siehe auch RET RET RET RETN RETF Return Return NEAR Return FAR Zur ckkehren nahlfern Syntax Flags Beschreibung Beispiele RET Zahl Zahl vorzeichenloser Direktoperand
102. er Sprung ausgef hrt Anders ausgedr ckt Die Schleife wird abgebrochen wenn CX 0 oder zf 1 ist Wie bei Loope Loopz muss also im Schleifenrumpfes mindestens ein Befehl stehen der das Zeroflag setzt l scht 7 5 Testfragen 1 Erg nzen Sie in dem folgenden Programmst ck die fehlenden Befehle oder Operanden Ausgabe der Ziffern von 9 abw rts bis 0 mov dl Schleifenstart mov ah 2 DOS Funktion Zeichenausgabe int 21h 27 cmp 777 777 jae Schleifenstart 2 Geben Sie den Inhalt des Registers AX nach dem folgenden Programmst ck an mov cx OFOh mov ax 0 Schleifenstart inc cx dec ax cmp cx 100h jb Schleifenstart 3 Finden Sie die Fehler in dem folgenden Programmst ck Belegen eines Wortfeldes mit dem Wert O DATA Feld DW 20 DUP CODE mov bx 1 Schleifenstart mov Feld bx 0 inc bx cmp bx 20 je Schleifenstart L sungen auf Seite 129 Kapitel 8 Rechnen in Assembler Arithmetische Befehle Der i80x86 hat Befehle zur Addition Subtraktion Division und Multiplikation mit vorzeichen losen Zahlen und vorzeichenbehafteten Zahlen Zahlen im Zweierkomplement F r die vorzei chenbehafteten Zahlen gibt es ausserdem einen Befehl zur Vorzeichenumkehr Bei der Addition und Subtraktion werden die gleichen Befehle benutzt egal ob man mit oder ohne Vorzeichen rechnet Bei Multiplikation und Division gibt es unterschiedliche Befehlsvarianten f r vorzei chenlose und vorzeichenbehaftete Zahl
103. etzten Operation ein Bitmuster entstanden ist das in den niederwertigen acht Bit aus einer geraden Anzahl von Einsen besteht Das Parityflag wird relativ selten benutzt u a weil es nur acht Bit auswertet Beispiel mov d1 110010b bin ren Zahlenwert 110010 nach dl einschreiben add dl 1 31 zu ax addieren Das Ergebnis 110011 hat eine gerade Anzahl von Einsen gt Parityflag wird gesetzt Auxiliary Carry Flag Das Auxiliary Carry Flag AF Hilfs bertragsflag wird gesetzt wenn bei der letzten Operation ein bertrag von Bit 3 auf Bit 4 also ein bertrag vom der unteren auf die obere Tetrade ent standen ist Dieses Flag ist nur beim Rechnen mit BCD Zahlen n tzlich und wird prozessorintern von den Ausrichtungsbefehlen benutzt Steuerflags Steuerflags setzt das Programm bzw der Programmierer um die Arbeitsweise des Prozessors zu steuern 18 KAPITEL 1 EINF HRUNG Trap Flag Das Trap Flag TF manchmal auch Trace Flag zu deutsch Fallenflag wird haupts chlich von Debuggern benutzt Wenn das Trap Flag gesetzt ist wird nach jedem ausgef hrten Maschi nenbefehl das Programm durch Interrupt Nr 4 unterbrochen Die Interrupt Behandlungsroutine gibt dann Informationen ber Register Flags und Speicher auf den Bildschirm wie wir es bei einem Debugger gewohnt sind Interrupt Flag Das Interrupt Flag IF Unterbrechungsflag steuert ob externe Unterbrechungen durch Hard warebausteine zugelassen werden In einem PC l uft die Bed
104. eutet dass der folgende Befehl ausgef hrt wird Wenn das Sprungziel nah genug ist k nnen relative Spr nge erzwungen werden durch jmp short 7 2 Bedingte Sprungbefehle Bedingte Sprungbefehle sind von Bedingungen abh ngig Ist die Bedingung wahr wird der Sprung ausgef hrt ist sie falsch wird er nicht ausgef hrt Es gibt viele unterschiedliche be dingte Sprungbefehle die sich auf unterschiedliche Bedingungen beziehen Die Bedingung ist im Namen des Befehles angedeutet und bezieht sich entweder direkt auf Flags oder auf einen vorausgegangenen Compare Befehl CMP Beispiele daf r sind JC Jump if Carry Springe wenn Carryflag gesetzt JG Jump if greater Springe wenn gr er JNE Jump if not equal Springe wenn nicht gleich Die Namen der bedingten Sprungbefehle JXXX sind nach folgendem Schema zusammenge setzt J immer erster Buchstabe JUMP N evtl zweiter Buchstabe NOT steht f r die Negierung der Bedingung Z C S O P wenn Zero Carry Sign Overflow Parityflag gesetzt E Equal gleich A B Above Below gr er kleiner bei vorzeichenloser Arithmetik G L Greater Less gr er kleiner bei Arithmetik mit Vorzeichen Daraus ergibt sich eine F lle von bedingten Sprungbefehlen die in Tab 7 1 aufgef hrt sind Man sieht dort auch dass die arithmetischen Bedingungen durch Kombinationen mehrerer Flags aus gewertet werden Viele Befehle sind mit zwei verschiedenen Mnemonics repr sentiert z B ist JZ
105. ferenz 1 differenz wird durch 2 geteilt Vorzeichen wird korrekt behandelt Divisionsrest ist im CF Rotate right Rotate left ROR ROL Rotieren nach rechts Rotieren nach links Syntax ROR ROL Operand Anzahl Operand reg8 16 32 mem8 16 32 Anzahl UCL Flags O C Beschreibung Rotiert den Operanden um eine oder mehrere Stellen bitweise nach rechtsllinks Das herausfallende Bit wird ins CF und auf den freiwer denden Platz bertragen Durch ROR wird also LSB nach MSB und ins CF bertragen bei ROL ist es umgekehrt Als Anzahl kann entweder 1 oder CL angegeben werden Im ersten Fall wird einmal um ein Bit rotiert im zweiten Fall so oft wie der Inhalt von CL vorgibt OF ist im zweiten Fall undefiniert S auch SHR SHL SAR SAL RCR RCL Beispiele MOV CL 8 ROL AX CL Gleichwertig mit XCHG AH AL Rotate through Carry right left RCRIRCL Rotieren durch Carry rechts links Syntax RCR RCL Operand Anzahl Operand reg8 16 32 mem8 16 32 Anzahl UCL Flags O C Beschreibung Schiebt Shiftet den Operanden um eine oder mehrere Stellen bitwei se nach rechts links Durch RCR wird das CF auf das MSB und das LSB ins CF bertragen Im Unterschied zu ROR ROL wird also das CF als Teil der rotierenden Einheit betrachtet Durch RCL wird das MSB ins CF und das CF ins LSB bertragen Als Anzahl kann entweder 1 oder CL angegeben werden Im ersten Fall wird einmal um ein Bit rot
106. h ufig verwendeter Transportbefehl kopiert den Quell operanden in den Zieloperanden der Quelloperand bleibt unver ndert Einschr nkungen e Beide Operanden miissen gleiche Bitbreite haben e Es k nnen nicht beide Operanden Speicheroperanden sein e Es k nnen nicht beide Operanden Segmentregister sein e Direktoperanden k nnen nicht in Segmentregister geschrieben wer den F r wiederholten Datentransport von zu Speicherpl tzen kommen auch die Befehle MOVS LODS und STOS in Frage Beispiele MOV AX 16 MOV AX DS Umweg ber AX notwendig MOV ES AX um DS nach ES zu kopieren MOV CH CL Anwendung auf 8 Bit Register MOV BX BP 4 mit Speicheroperand XCHG Exchange Austauschen Syntax XCHG Operand1 Operand2 Operand1 reg8 16 32 mem8 16 32 Operand2 reg8 16 32 mem8 16 32 Flags Beschreibung Datenaustausch zwischen zwei Registern oder Register und Speicher Beide Operanden m ssen gleiche Bitbreite haben und wenigstens einer von beiden muf ein Registeroperand sein Beispiele XCHG CH CL XCHG AX BX DI 1 MOVZX MOVSX Move with Zero Sign Extension Bewegen mit Null Vorzeichenerweiterung 134 KAPITEL 16 ASSEMBLERBEFEHLE NACH GRUPPEN Syntax movzx movsx Operandl Operand2 Operand1 reg16 32 mem16 32 Operand2 reg8 16 mem8 16 Flags Beschreibung Datentransport von kleineren in gr ere Register Die Daten werden immer auf die niederwertigen Bits geschrieben MOVZX f llt dabei die frei bl
107. h eins zusetzen Beispiel mov al OCCh AL 11001100b or al 2h OR 00000010b Ergebnis AL 11001110b CEh XOR das exclusive ODER Ein bitweise logisches exclusives ODER wird durch den XOR Befehl durchgef hrt Ein Ergeb nisbit ist gleich Eins wenn die Operandenbits ungleich sind sonst gleich Null Operanden wie OR Beispiel mov al 0C3h AL 11000011b xor al 033h XOR 00110011b Ergebnis AL 11110000b O Der xor Befehl kann benutzt werden um gezielt einzelne Bits zu invertieren toggeln z B xor ax 02h invertiert Bit 1 und l t alle anderen Bits unver ndert 6 2 SCHIEBE UND ROTATIONSBEFEHLE 53 NOT bitweise Invertierung Der letzte Vertreter ist der NOT Befehl der einfach alle Bits eines Operanden invertiert und daher auch nur einen Operanden braucht Beispiel mov al OER AL 11100101b not al Ergebnis AL 00011010b 1Ah Weitere Anwendungen Die bitweise logischen Befehle werden manchmal etwas trickreich genutzt z B Schnelles Null setzen Oft m ssen Register auf den Wert Null gesetzt werden Das geht auch mit xor ax ax Schneller und k rzer als mov ax 0 Schnelles Setzen von Flags Nehmen wir an in Register AL befindet sich ein unbekannter Wert und wir wollen wissen ob dieser Wert Null ist Das Zeroflag kann nun gesetzt werden mit or al al k rzer und schneller als cmp al 0 6 2 Schiebe und Rotationsbefehle Die Befehle dieser Gruppe erlauben es ein komplettes Bitmuster
108. hl durchf hrt mov eax 00010004h mov ebx 00030002h movd mm0 eax movd mm1 ebx pmaddwd mmO mmi Mutliplikationen des unteren Wortpaares 2 4 des oberen Wortpaares 1 3 und Addition 3 8 movd eax mmO Ergebnis EAX 0000000Bh 11d Um nun wirklich ein digitales signalverarbeitendes System zu realisieren m te man zun chst die Eingangswerte und Koeffizienten so skalieren dass man mit 16 Bit Worten ausreichende Genauigkeit erreicht Dann k nnte man z B in mm1 den Eingangswert s n m und die Zwi schensumme ablegen in mm0 dagegen am und eine 1 Der Befehl pmaddwd w rde dann in einem Schritt Zwischensumme x n m a berechnen und in der unteren H lfte von mm0 ablegen In der oberen H lfte der Einheit k nnte gleichzeitig etwas anderes berechnet werden z B eine neue Zwischensumme aus dem B y n k Zweig 12 4 Befehls bersicht Zum Schluss des Kapitels gebe ich noch eine knappe bersicht ber den Befehlssatz der MMX Einheit 94 KAPITEL 12 DIE MMX EINHEIT Arithmetische Befehle Addition Subtraktion und Multiplikation gepackter Daten mit und ohne S ttigung Multiplikation und Addition in einem Schritt Vergleichsbefehle Vergleich gepackter Daten auf Gleichheit oder gr er Ablage der Ergeb nisflags im Zielregister Umwandlungsbefehle Packen von Worten in Bytes oder Doppelworten in Worte dabei Be folgung der S ttigungsarithmetik Entpackbefehle Erweiterung von Bytes zu Worten Worten zu Doppelwort
109. hn in AX zur ck model small stack 100h code start mov ax 15 Vorbereitung des Unterprogrammaufrufs mov bx 19 S Ubergabe der Parameter in AX und BX CALL Mittelwert_ax_bx Unterprogrammaufruf mov ah 4ch Programmende int 21h 81 82 KAPITEL 10 UNTERPROGRAMME PROC Mittelwert_ax_bx add ax bx Summe aus ax und bx nach ax shr ax 1 durch zwei teilen ret Return R cksprung ENDP Mittelwert_ax_bx END Start Die Verwendung von PROC und ENDP ist nicht notwendig ist aber sehr zu empfehlen F r die bergabe von Parametern und Ergebnissen gibt es verschiedene M glichkeiten bergabe in Registern Einfach und gut blich in reinen Assemblerprogrammen z B BI OS DOS M glich ist auch die R ckgabe von Ergebnissen in Flags Nachteil Anzahl und Umfang der Parameter begrenzt Bei gro en Datenstrukturen muss man diese in Puffer speichern halten und Zeiger auf diese Daten in Registern bergeben Stack bergabe In Hochsprachen implementiert etwas komplizierter erm glicht aber fast unbegrenzte bergabe ber globale Variable f hrt zu Abh ngigkeiten von Variablendefinitionen im rufenden Pro gramm R ckgabe der Ergebnisse Seiteneffekt Schlecht und nur eine Notl sung Der R cksprung an die richtige Stelle im rufenden Programm wird auf folgende Art gesichert CALL speichert die Adresse des n chsten Befehles nach CALL die R cksprungadresse im rufenden Programmst ck auf den Stack RET holt die
110. iablen Zugriff mit Adresse und indirekter Adressierung lea ebx Anzahl lea load effective adress l d die Adresse den Offset von Anzahl nach ebx mov ebx 0 Zugriff ber den Zeiger indirekte Adressierung Zugriff auf ein Array nutzen immer die indirekte Adressierung Der Index kann fix oder flexibel sein _asm Direkter Zugriff auf ein Element eines Arrays mov puffer 4 eax Achtung kopiert eax in puffer 1 Zugriff ber die Adresse lea ebx puffer Adresse des arrays nach ebx mov ebx 12 20 puffer 3 20 Zugriff mit flexiblem Index mov ecx 3 C Feldindex z B nach ecx mov eax puffer ecx TYPE puffer Anfangsadresse Index Gr e TYPE int 4 s o Zugriff auf eine Struktur _asm Direkter Zugriff auf Elemente der Struktur mov student alter 23 direkter Zugriff 108 KAPITEL 13 DIE SCHNITTSTELLE ZWISCHEN ASSEMBLER UND C C mov esi student name Zeiger nach esi laden Zugriff auf die Struktur ber die Adresse lea ebx student Adresse mov ecx ebx alter Zugriff Konstanten k nnen wie Assemblerkonstanten geschrieben werden oder wie C Konstanten z B _asm mov eax OO1FFFFFh Assembler Schreibweise mov eax Ox1FFFFF C Schreibweise Sprungbefehle Als Sprungziele k nnen sowohl Inline Assembler Sprungmarken genannt werden als auch C C Sprungmarken Alle Sprungmarken k nnen sowohl durch Assemblerbefehl z b jmp oder durch C C Befehl
111. iben wollen nehmen wir danach einen Betriebssytemaufruf Funktion 9 von Int 21h zu Hilfe Danach folgt schon ein Betriebs sytemaufruf zur Beendigung des Programmes Es wurden nur zwei Assemblerbefehle benutzt MOV zum Datentransport und INT f r die Betriebssystemaufrufe Wenn das Programm fertig editiert ist wird es als Assembler Quelldatei gespeichert d h als ASM Datei z B HALLO ASM Danach wird sie assembliert im Falle des Borland Assmblers mit TASM Dateiname ASM oder einfach TASM Dateiname in unserem Beispiel also TLINK HALLO Der Assembler bersetzt und pr ft nun das geschriebene Programm Wenn es keine schweren Fehler mehr enth lt erzeugt er eine Zwischendatei die sog Objektdatei in unserem Fall also HALLO OBJ Diese enth lt schon den erzeugten Maschinencode aber noch nicht die richtigen Adressen f r Unterprogramme und Sprungmarken Um auch das Zusammenbinden mehrerer Assembler und Hochsprachenprogramme zu erm glichen gibt es ein weiteres Werkzeug den Binder engl Linker Im n chsten Schritt wird also der Linker aufgerufen um den Objektfile zu binden linken TLINK Dateiname OBJ oder einfach TLINK Dateiname in In dem gezeigten Listing werden die sogenannten vereinfachten Segmentdirektiven des Borland Assemblers benutzt Eine andere M glichkeit ist die direkte Definition der Segmente mit SEGMENT und ENDS 1 3 EIN ERSTES PROGRAMM IN ASSEMBLER 21 In unserem Fall muss es also hei en TLINK HALL
112. ic Right Speziell f r das Rechnen durch Schieben ausgelegt Leisten Division durch zwei oder Multiplika tion mit zwei auch bei vorzeichenbehafteten Zahlen SAL arbeitet exakt wie SHL SAR dagegen funktioniert etwas ungew hnlich Beim Schieben nach rechts wird das MSB sowohl geschoben als auch auf das neue MSB reproduziert Die folgenden Beispiele zeigen dass damit auch f r negative Zahlen richtig gerechnet wird Beispiel Multiplizieren mit 2 mov al 1 al 11111111b 1 sal al 1 al 11111110b 2 sal al 1 al 11111100b 4 USW Beispiel Dividieren durch 2 mov al 16 al 11110000b 16 sar al 1 al 11111000b 8 sar al 1 al 11111100b 4 sar al 1 al 11111110b 2 sar al 1 al 11111111b 1 sar al 1 al 11111111b 1 Rundung nach unendlich usw ROL Rotate Left ROR Rotate Right Einfache Rotationen nach links oder rechts Das herausgefallene Bit kommt auf die freiwerdende Bitstelle und ins Carryflag RCL Rotate through Carry Left RCR Rotate through Carry Right hnlich ROL und ROR mit dem Unterschied dass hier das Carryflag als Bit auf die freiwerdende Stelle gelangt und das herausgefallene Bit ins Carryflag kommt Das Carryflag ist hier quasi ein Teil der Datenstruktur 6 2 SCHIEBE UND ROTATIONSBEFEHLE 55 C F MSB LSB MSB tss CF 4 Damn jo 0 gt Daten SHL SHR CF use LSB ss CF Daten 0 eebe SAL SAR CF ERA me CF Daten Daten gt Beispiele 1 bertragung
113. iebssystemaufruf gibt in vielen F llen Daten zur ck welche dann nach der Ab arbeitung des BS Aufrufs in Registern liegen Diese k nnen nun dort abgeholt und aus gewertet werden Die Daten liegen meist in den Registern BX CX DX Ein nach dem Aufruf gesetztes Carry Flag zeigt einen Fehler an die Fehlernummer findet sich in AL Zu den Betriebssystemaufrufen gibt es nat rlich Dokumentationen in denen die Schnittstelle d h die bergabe der Daten in Registern genau beschrieben ist Dabei wird unterschieden zwischen Daten bergabe vom Programm an das Betriebssystem Vorbereitung Bezeichnung auch Daten vor Aufruf oder Eingabe Daten bergabe vom Betriebssystem an das Programm Auswertung Bezeichnung auch Daten nach Aufruf oder R ckgabe Beispiele In der Dokumentation findet man zu Funktion 1 von Int 21h z B folgende Information DOS Funktion Olh Zeichen von Tastatur einlesen Vor Aufruf AH 1 Nach Aufruf Von Tastatur eingelesenes Zeichen in AL Man muss also vor dem Aufruf in das Register AH eine 1 einschreiben die Nummer des Funk tionsaufrufes Die aufgerufene Systemroutine bernimmt dann das Lesen des Zeichens von der Tastatur sie wartet also geduldig bis der Benutzer eine Taste dr ckt Dann legt sie den Code 48 KAPITEL 5 BETRIEBSSYSTEMAUFRUFE der gedriickten Taste in Register AL und beendet sich Jetzt wird im Anwendungsprogramm der nach dem INT 21h folgende Befehl ausgef hrt Man wird hier nor
114. ienung der externen Ger te und Schnittstellen fast nur ber Interrupts weil dieses Konzept sehr effektiv ist Das Interrupt Flag ist daher in der Regel gesetzt und wird nur in Ausnahmef llen f r kurze Zeit gel scht Direction Flag Das Direction Flag DF Richtungsflag wirkt nur auf eine ganz bestimmte Gruppe von Befeh len die sog Stringbefehle Diese Stringbefehle verarbeiten gleich einen ganzen Block oder String von Daten Dabei werden automatisch bestimmte Zeigerregister EDI und ESI benutzt und inkrementell ver ndert Das Direction Flag steuert nun ob der Datenblock mit auf oder absteigenden Adressen sequentiell bearbeitet wird 1 3 EIN ERSTES PROGRAMM IN ASSEMBLER 19 1 3 Ein erstes Programm in Assembler Der Aufbau eines Assemblerbefehles Wir wollen nun ein erstes einfaches Programm in Assembler schreiben bersetzen und zum Ablauf bringen Der Aufbau eines einzelnen Assemblerbefehles ist wie folgt Marke Befehl Operande en Kommentar Marke ist eine Bezeichnung f r den Speicherplatz an dem dieser Befehl sp ter stehen wird sie wird in der Regel f r Sprungbefehle benutzt Befehl ist das Mnemonic des Assemblerbefehls z B MOV oder INC Die Mnemonics d rfen beliebig klein oder gro geschrieben werden Operand en sind ein zwei oder drei Operanden je nach Befehl Es gibt auch Befehle die keine Operanden brauchen Auch Register und Speicherplatzbezeichnungen d rfen beliebig klein oder gro
115. iert im zweiten Fall so oft wie der Inhalt von CL vorgibt OF ist im zweiten Fall undefiniert S auch ROR ROL SHR SHL SAR SAL 138 KAPITEL 16 ASSEMBLERBEFEHLE NACH GRUPPEN Beispiele MOV CL 5 ROL var1 CL rotiert var1 um 5 Bit 16 5 Einzelbit Befehle Bit Search Forward Bit Search Reverse BSFIBSR Bitsuche vorw rts Bitsuche r ckw rts Syntax BSF BSR Operandl1 Operand2 Operand1 reg16 32 Operand2 reg16 32 mem16 32 Flags Z Beschreibung Durchsucht den ersten Operanden nach dem ersten auftretenden 1 Bit BSF durchsucht vom niedrigstwertigen Bit LSB an BSR beginnt beim h chstwertigen Bit MSB Die gefundene Bitposition wird im zweiten Operanden abgelegt Beispiele BSF EAX ECX Bit Test Bit Test and Set Bit Test and Reset Bit Test and BT BTS BTR BTC GE Bit Testen Bit testen und setzen Bit testen und l schen Bit testen und invertieren Syntax BT BTS BTR BTC Operandi Operand2 Operandi reg16 32 mem16 32 Operand2 reg16 32 Direktoperand Flags C Beschreibung BT bertr gt ein Bit aus dem ersten Operanden in das Carryflag Die Bitnummer wird im zweiten Operanden angegeben BTS setzt anschlie Bend dieses Bit im ersten Operanden auf 1 BTR setzt es auf 0 und BTC komplementiert invertiert es Beispiele BT EAX 5 BTS AX CX 16 6 ARITHMETISCHE BEFEHLE 139 16 6 Arithmetische Befehle
116. ind Gruppen von Flipflops mit gemeinsamer Steuerung Jedes Programm das auf einem Computer abl uft wird in viele kleine Finzelschritte zerlegt die der Prozessor dann ausf hrt Wie sehen diese Einzelschritte aus Jeder Prozessor verf gt ber einen gewissen Vorrat an Aktionen den Befehlssatz Die Befehle des Befehlssatzes hei en auch die Maschinenbefehle Es gibt Maschinenbefehle f r den Datenaustausch mit Speicherzellen f r das Ansprechen von Peripherieger ten f r den Transport zwischen Registern f r die bitweise Ver nderung von Daten f r arithmetische Operationen an Daten und f r vieles andere mehr Busleitungen Register A1 00 2A 8B C8 andere Bausteine D1 EO 02 03 C3 A3 00 28 Arithmetisch logische Einheit Speicher Prozessor Ein Mikroprozessor kann immer nur durch Maschinenbefehle angesteuert werden alle anderen Bitmuster erkennt er nicht und verweigert die Arbeit Fin Programm das auf diesem Prozessor laufen soll muss also so in Teilschritte zerlegt werden dass sich jeder Teilschritt durch einen entsprechenden Maschinenbefehl umsetzen l t Dazu ein Beispiel Auf einem Mikroprozessor soll ausgef hrt werden 1 1 MASCHINENCODE UND ASSEMBLERSPRACHE 9 A 5 B 1 Dies k nnte z B wie folgt realisiert werden e Hole Inhalt der Speicherzelle B in Arbeitsregister 1 e Kopiere Inhalt des Arbeitsregisters 1 in Arbeitsregister 2 e Verschiebe Inhalt des Arbeitsregister 1 um zwei Bit nach links ents
117. iner Konstante s Abschn 2 4 Das Paar aus Segment und Offset hei t auch logische Adresse Logische Adressen werden meist mit einem Doppelpunkt geschrieben Beispiel B800 0200 ist die Adresse mit dem Segmentanteil B800h und dem Offset 200h Speicher Segmentende 16 Segment FFFFh gt 16 Segment Offset gt pr 16 Segment gt Segmentanfang Abbildung 2 1 Aufbau eines 16 Bit Segmentes Die obige Berechnungsvorschrift hat folgende Konsequenzen 1 Es gibt Adressen die man allein durch Ver nderung des Offset Anteils bilden kann Nahe oder NEAR Adressen 2 F r weiter entfernt liegende Adressen muss auch das Segmentregister umgesetzt werden Weite oder FAR Adressen 3 Der Adressraum den man ohne nderung eines Segmentregisters erreichen kann ist 64 kB gro und hei t Segment Der Offset ist dabei die Position des Speicherplatzes relativ zum Segmentanfang Eine andere Bezeichnung f r Offset ist effektive Adresse 4 Der Segmentanfang f llt immer auf ein Vielfaches von 16 16 Byte sind ein Paragraph 5 Zu einer logischen Adresse gibt es immer eine eindeutige physikalische Adresse umgekehrt gilt das nicht Beispiel Segment B800h Segment B920h Offset 1234h Offset 0034h Physikalische Adresse B9234h Physikalische Adresse B9234h 2 2 16 BIT UMGEBUNGEN DER SEGMENTIERTE HAUPTSPEICHER 27 6 F r das verwendete Segmentregister werden automatische Vorgaben benutzt Bei Zugriff auf Programmco
118. ion wenn die zu bertragende Zahl vorzeichenbehaftet ist also im Zweierkomplement dargestellt ist Dann m ssen die h herwertigen Bit mit Null Bits beschrieben werden wenn die Zahl positiv ist und mit Eins Bits wenn die Zahl negativ ist Man m te also zun chst das Vorzeichen ermitteln Wie berhaupt und danach verzweigen eine Sequenz von insgesamt mindestens f nf Befehlen add dl 0 Vorzeichenflag setzen js negativ jump if sign negativ mov eax 0 pos Zahl Nullbits schreiben jmp transport negativ mov eax OFFFFFFFFh Eins Bits schreiben transport mov al dl Hier hilft der Befehl MOVSX Move and extend sign also Transportiere und erweitere mit Vorzeichen Die obige Aufgabe kann dann mit einem Befehl erledigt werden movsx eax dl Die beiden Befehle MOVZX und MOVSX stehen erst ab dem 80386 zur Verf gung 3 4 BEDINGTES SETZEN VON REGISTERN ODER SPEICHERPL TZEN 41 3 4 Bedingtes Setzen von Registern oder Speicherpl tzen Mit den Befehlen der SETcc Familie SET if Condition kann abh ngig von den Bedingungs flags eine 1 oder 0 in einen Zieloperanden geschrieben werden Der Zieloperand muss ein 8 Bit Register oder eine 8 Bit Speichervariable sein Die 1 oder 0 wird dann als 8 Bit Wert 00h 01h eingeschrieben Die Bedingungsflags m ssen zuvor durch einen CMP oder SUB Befehl gesetzt werden Ein Beispiel cmp ax bx Compare ax bx setne dl schreibt in dl eine 1 wenn ax ungleich bx ist bzw eine 0 wenn ax bx 3
119. iplikation ist der Multiplikand AL und das Ergebnis wird in AX abgelegt Bei der Wort Multiplikation ist AX der Operand und das Ergebnis wird in DX AX abgelegt wobei AX das niederwertige Wort enth lt Bei der Doppelwort Multiplikation ist EAX der Multiplikand und das Ergebnis wird in EDX EAX abgelegt Da ein Overflow nicht m glich ist werden die Flags CF und OF dann gesetzt wenn das Ergebnis die Bitbreite der Quelloperanden berschreitet Siehe auch DIV IDIV 142 KAPITEL 16 ASSEMBLERBEFEHLE NACH GRUPPEN Beispiele Multiplikation zweier 8 Bit Speicheroperanden DATA Multiplikand db 50 Multiplikator db 12 CODE MOV AL Multiplikand AL 50 MUL Multiplikator Byte Multiplikation mit 12 gt AX 600 CF 1 OF 1 da Ergebnis gt 255 Integer Multiplication IMUL vorzeichenrichtige Multiplikation Beschreibung IMUL existiert ab dem 386 in drei Varianten Mit einem zwei oder drei Operanden Die erste Variante stellt f r das Multiplikationsergebnis doppelt so viele Bit zur Verf gung wie die Operanden haben die beiden letzten nur gleich viele In den beiden letzten Varianten sind also ernste Fehler m glich In allen F llen werden die Flags CF und OF dann gesetzt wenn das Ergebnis die Bitbreite der Quelloperanden berschreitet F r die Varianten mit zwei oder drei Operanden bedeutet dies einen echten Fehler Syntax IMUL Multiplikator Multiplikator reg8 16 32 mem8 16 32 Flags O
120. ktisch ist Assembler auch beim Zugriff auf IO Ports Alle direkten Hardwarezugriff sind unter Multiuser Betriebs systemen allerdings dem Betriebssystem und den Ger te Treibern vorbehalten F r die Anwendung von Assembler in C C gibt es zwei M glichkeiten Inline Assembler Eine sehr einfache M glichkeit Statt eines C C Befehles kann jederzeit ein Assemblerbefehl oder ein Block aus Assemblerbefehlen stehen es ergibt sich also eine Mischung aus C C und eingestreuten Assemblerbefehlen Externe Assemblerprogramme Unterprogramme werden separat assembliert und dann zu dem kompilierten C C Programm gebunden Externe Assemblerprogramme m ssen sich streng an die Konventionen der Hochsprache halten z B Stack bergabe von Para metern und R ckgabe von Ergebnissen in vereinbarten Registern gelinkt 95 96 KAPITEL 13 DIE SCHNITTSTELLE ZWISCHEN ASSEMBLER UND C C 13 2 16 32 Bit Umgebungen 16 Bit Umgebung 32 Bit Umgebung Bsp Betriebssystem Prozessor DOS Real Mode 8086 Pentium Windows 98 NT Linux 80386 Pentium typ Registerbenutzung typ Assemblerbefehle AX BX CX 8086 Befehlssatz EAX EBX ECX 80386 Befehlssatz Zeiger NEAR PTR Offset zu 16 Bit 32 Bit Offset FAR PTR Segment Offset ein Register je 16 Bit zwei Register Speicheraufbau Segmente zu 64 kB flaches Speichermodell alles liegt in einem Segment von max 4GB Physikalische Adressen 16 Seg Offs f r Prog
121. legt werden Die Zahlen liegen im Double extended Precision 84 11 3 BEFEHLSSATZ 85 floating point Format auch Temporary Real Format genannt vor Abb 11 1 Das Statuswort ist ein 16 Bit Register das Flags und Bitfelder mit Informationen ber den momentanen Zustand der FPU enth lt dazu geh ren Flags f r Genauigkeitsverlust Unterlauf berlauf Division durch Null ung ltige Operation Busy Condition Flags C1 C4 und der 3 Bit Zeiger Top of Stack Der wichtigste Bestandteil der Gleitkommaeinheit ist aus der Sicht des Programmierers der Block mit den acht Gleitkommaregistern die als Stack organisiert sind Alle arithmetischen Befehle und Transferbefehle beziehen sich auf Register des Stacks 835 720012 79 0 Abbildung 11 2 Registerstack der Gleitkommaeinheit Zuletzt wurde der Wert 835 710012 ge laden Im Registerstack werden die Register entsprechend Ihrer Lage zum Top of Stack bezeichnet Die zuletzt geladene Zahl ist ST 0 die davor geladene ST 1 usw 11 3 Befehlssatz 11 3 1 Datentransportbefehle Daten k nnen mit den Ladebefehlen aus dem Speicher in den Registerstack geladen werden Beim Laden findet die automatische Typkonvertierung in das intern benutzte 80 Bit Format statt Die geladene Zahl ist automatisch das neue ST 0 aus ST 0 wird ST 1 usw Jedes Laden enth lt also implizit ein PUSH Es gibt mehrere Ladebefehle f r verschiedene Datentypen in den Befehlsnamen steht immer LD f r Load FLD
122. leichen Speichermodelle findet man z B auch in Borland C Programmen Das Speichermodell wird am Anfang unserer Assemblerpro gramme mit der Anweisung MODEL eingestellt Speicher 16 SS XXXX gt Stack Daten 16 DS 0000 gt Code 16 CS 0000 Abbildung 2 2 Angelegte 16 Bit Segmente bei einem Programm im Speichermodell SMALL Beide Segmente sind 64 kB gro Um einen Speicherplatz absolut zu adressieren muss man einen entsprechenden FAR Zeiger aufsetzen Nehmen wir z B an dass der Speicherplatz mit der physikalischen Adresse B8000h mit einem A beschrieben werden soll Dann k nnte man mit dem Segmentanteil B000h und dem Offset 8000h arbeiten Genausogut k nnte man Segmentanteil B800h und Offset 0 verwenden Der Segmentanteil muss dann in ein Segmentregister geschrieben werden Einfach ist hierbei die Verwendung von ES mit anschliessendem Segment Override Der Programmcode k nnte sein mov ax B000h ES mit Segmentanteil laden mov es ax mov bx 8000h Offset nach BX FAR Zeiger liegt in ES BX mov es bx A Zugriff mit FAR Zeiger Das DS Register kann man ohne Segment Override benutzen Man muss es aber retten und nachher wiederherstellen damit es auf das angelegte Datensegment verweist mov ax B000h ES mit Segmentanteil laden 2 3 32 BIT UMGEBUNGEN DER UNSEGMENTIERTE HAUPTSPEICHER 29 push ds DS auf den Stack retten mov ds ax mov bx 8000h Offset nach BX FAR Zeiger liegt in DS BX mov bx
123. ler eingebunden werden Dabei hat man bequemen Zugriff auf die Variablen und Funk tionen des C C Programms muss sich allerdings an einige Regeln halten Diese sind im Folgenden erl utert Das _asm Schl sselwort berall wo ein C C Befehl stehen darf kann stattdessen auch das Schl sselwort _asm gefolgt von einem Assemblerbefehl stehen Beispiel _asm mov eax 0 _asm mov ebx Ox0O0AAFFFFh _asm shr ebx 2 106 KAPITEL 13 DIE SCHNITTSTELLE ZWISCHEN ASSEMBLER UND C C Nach _asm ist auch ein Assemblerblock erlaubt der von geschweiften Klammern eingeschlossen ist Die drei obigen Befehle k nnen also auch wie folgt in das C C Programm eingef gt werden asm mov eax 0 mov ebx Ox00AAFFFFh shr ebx 2 Statt Division durch 4 An Inline Assembler Zeilen darf nach einem Semikolon ein Assembler Kommentar angef gt wer den Zugriff auf C C Symbole Die Inline Assembler Befehle k nnen grunds tzlich auf alle C C Variablen Funktionen und Sprungmarken zugreifen die in dem aktuellen Block sichtbar sind Einschr nkungen In jedem Assemblerbefehl kann nur auf ein C C Symbole zugegriffen werden Funktionen auf die zugegriffen wird m ssen vorher deklariert sein Assemblerbefehle k nnen nicht auf C C symbole zugreifen deren Name in Assembler sprache ein reserviertes Wort sind z B eax esi egs mov test aaa lods usw e structure und union tags werden in Inline Assembler nicht erkannt Der Umgang mit
124. malerweise das in Al bergebene Zeichen auswerten Programmbeispiel mov ah 1 DOS Funktion 1 Zeichen von der Tastatur lesen int 21h DOS aufrufen cmp al 13 Compare ist das eingelesene Zeichen der Code der Returntaste usw Die DOS Funktion 2 dient dazu ein Zeichen auf den Bildschirm zu schreiben In der Dokumen tation findet man DOS Funktion 02h Zeichen auf Bildschirm ausgeben Vor Aufruf AH 2 DL auszugebendes Zeichen Nach Aufruf Der folgende Programmabschnitt gibt ein Ausrufezeichen auf den Bildschirm aus mov ah 2 DOS Funktion 2 Zeichen auf Bildschirm ausgeben mov dl auszugebendes Zeichen muss in DL liegen int 21h DOS aufrufen keine R ckgabewerte Auswertung entf llt DOS und BIOS sind selbst Assemblerprogramme und benutzen die gleichen Register und Flags wie unsere Anwenderprogramme Sowohl DOS als auch BIOS sind in der Regel so programmiert da sie nur die als Ausgaberegister dokumentierten Register ver ndern Eine Ausnahme bildet AX das oft ver ndert wird F r die Programmierung von Betriebssystemaufrufen verwendet man meist Tabellen in denen die Belegung der Register vor und nach dem jeweiligen Aufruf dokumentiert ist 5 3 Einige N tzliche Betriebssystemaufrufe DOS INT21h Funktion Olh Zeichen von Tastatur einlesen Vor Aufruf AH 1 Nach Aufruf Von Tastatur eingelesenes Zeichen in AL DOS INT21h Funktion 02h Zeichen auf Bilds
125. mate SP a 63 0 ve e ee owe 63 0 AAA re 63 0 Abbildung 12 3 Die Addition von acht gepackten Bytes mit dem PADDB Befehl mov ebx 02030410h Summe bei 32 Bit Ganzzahladdition ist 03050800h movd mm0 eax movd mm1 ebx paddb mm mm gepackte Addition von Bytes movd eax mmO Ergebnis EAX 03050700h Der Unterschied zur 32 Bit Ganzzahlarithmetik liegt in der Stelle mit der Ziffer 7 der bertrag aus der Addition der unteren Bytes wurde eben nicht auf das n chste Byte bertragen da die acht Bytes als unabh ngige Einheiten behandelt werden Der Befehl paddw addiert vier gepackte Worte paddd addiert zwei gepackte Doppelworte Betrachten wir noch einmal das obige Beispiel Auf dem unteren Byte findet genau der im Multimediabereich unsinnige berlauf statt den man mit S ttigungsarithmetik vermeiden kann mov eax 010203F0h mov ebx 02030410h Summe bei 32 Bit Ganzzahladdition ist 03050800h movd mm0 eax movd mm1 ebx paddusb mmO mmi gepackte Addition von Bytes vorzeichenlose S ttigung movd eax mmO Ergebnis EAX 030507FFh paddusb steht f r packed add with unsigned saturation bytes Das Ergebnis FFh im letzten Byte ist der S ttigungswert vorzeichenloser 8 Bit Zahlen In Tabelle 12 1 sind alle S ttigungswerte 92 KAPITEL 12 DIE MMX EINHEIT unterer S ttigungswert oberer S ttigungswert Vorzeichenlose 8 Bit 0 255 Zahl 16 Bit 0 65535 Vorzeichenbehaftete 8 Bit 128 127 Zahl 1
126. mblermodul in dem sie codiert sind werden sie als PUBLIC deklariert 4 Daten die in einem C Modul angelegt sind k nnen in einem Assemblermodul benutzt werden wenn sie dort im Datenbereich nach DATA als EXTRN unter Angabe des Datentyps s u deklariert sind 5 Initialisierte Daten werden in Assemblermodulen unter DATA definiert nicht initialisierte Daten unter DATA Sie k nnen in C Modulen benutzt werden wenn sie dort als extern deklariert sind Datentyp von C Variablen in Assembler Wenn in einem Assemblerprogramm C Variablen mit EXTRN deklariert werden mu der Assembler Datentyp angegeben werden der dem C Datentyp dieser Variablen entspricht z B In einem C Programm Eine Alternative bietet die Deklaration als EXTRN C 13 6 EINBINDUNG VON ASSEMBLERCODE IN C C PROGRAMME char c wird in externer Assemblerfunktion benutzt und in einer externen Assemblerroutine EXTRN _c Byte Import aus C Modul DEC BYTE PTR _c Welche Datentypen in Assembler den C Datentypen entsprechen zeigt die folgende Tabelle Datentyp in C Datentyp in Assembler L nge in Byte unsigned char char enum unsigned short short unsigned int int unsigned long long float double long double near far byte byte word word word word word dword dword dword qword tbyte word dword ee N Ee R ckgabe von Funktionsergebnissen 115 Wenn eine Assemblerfunktion einen F
127. mblerwelt 13 10 MOV AH 9 DOS Funktion print string MOV DX OFFSET Kopfzeile Adresse von Kopfzeile INT 21h Zeile ausgeben 16 9 Stringbefehle Alle Stringbefehle MOVS LODS STOS CMPS SCAS haben folgende Gemeinsamkeiten e Die Adressierung erfolgt immer ber die Registerpaare DS SI undloder ES DI e Die beteiligten Indexregister DI undloder SI werden nach der Ausf hrung des Befehls automatisch ver ndert Diese Ver nderung h ngt von der Bitbreite des Befehls und der Stellung von DF ab DF 0 DF 1 Byteoperation 1 1 Wortoperation 2 2 Doppelwortoperation 4 4 e F r die Stringbefehle gibt es eine Befehlsform aus der nicht ersichtlich ist ob ein Byte oder Wortbefehl ausgef hrt werden soll z B MOVS statt MOVSB MOVSW oder MOVSD In dieser Form m ssen Operanden angegeben werden die aber nicht adressiert werden sondern nur die Bitbreite anzeigen e Die Stringbefehle k nnen mit den Wiederholungspr fixen REP REPE REPNE versehen werden so da Schleifen in einer Befehlszeile programmiert werden k nnen MOVSB MOVSW MOVSD Move String BytelWord Doublewor Stringtransport Byte Wort Doppelwor Syntax MOVSB MOVSW MOVSD Flags Beschreibung Kopiert ein Byte Wort Doppelwort von DS SI nach ES DI 16 9 STRINGBEFEHLE Beispiele DATA titel string bvari DB 50 DUP DB o DB OFFh CODE bvar2 MOV MOV MOV AX DS E ES AX
128. men Beispiel DATA Zaehler DB 0 Spalte DW Feld DB 10 DUP CODE inc Zaehler Bytezugriff wegen Variablendeklaration dec Spalte Wortzugriff wegen Variablendeklaration mov bx offset Feld mov al bx Aus Zielregister AL erkannt Bytezugriff inc bx Unklar ob Byte oder Wortzugriff Assembler codiert Wortzugriff und gibt Warning aus Diese Unklarheit wird beseitigt durch die Verwendung eines Typoperators inc BYTE PTR bx Bytezugriff 34 KAPITEL 2 ORGANISATION UND BENUTZUNG DES HAUPTSPEICHERS Die erlaubten Typoperatoren sind BYTE PTR Auf die adressierte Speicherstelle wird als 8 Bit Dateneinheit Byte zugeriffen WORD PTR Auf die adressierte Speicherstelle wird als 16 Bit Dateneinheit 2 Byte ein Wort zugeriffen DWORD PTR Auf die adressierte Speicherstelle wird als 32 Bit Dateneinheit 4 Byte ein Doppelwort zugeriffen In dem folgenden Beispiel wird der Typoperator BYTE PTR ausgenutzt um auf die beiden Bytes eines Wortes getrennt zuzugreifen DATA Zaehler DW CODE mov al BYTE PTR Zaehler niederwertiges Byte laden mov b1 BYTE PTR Zaehler 1 h herwertiges Byte laden Nun sei noch das Beispiel mit der Bestimmung der H ufigkeit der Buchstaben in einer Zeichen kette vollst ndig angegeben MODEL SMALL Speichermodell SMALL STACK 100h 256 Byte Stack reservieren DATA Zeichenkette DB Morgenstund hat Gold im Mund O Zeichenkette DB AAABBC 0 zum Testen Haeufigkeit DB
129. mer Zeiger die Offset und Segment enthalten hei en FAR Zeiger bzw FAR Pointer Die Unterscheidung zwischen NEAR oder FAR Adressen gibt es auch beim Programmcode So muss z B bei einem Sprungbefehl in einem kleinen Programm weniger als 64 kB nur das IP Register umgesetzt werden In einem gro en Programm muss zus tzlich das CS Register um gesetzt werden Das f hrte zur Entwicklung der sog Speichermodelle Ein Speichermodell legt vor der bersetzung fest wieviel Platz f r Daten und Code zur Verf gung steht In Segmenten bis 64 kB kann dann sowohl bei Code als auch bei Daten mit NEAR Zeigern gearbeitet werden in gr eren mit FAR Zeigern Durch die Wahl des richtigen Speichermodells versucht man al so m glichst effiziente Programme zu erstellen Der Turbo Assembler von Borland unterst tzt folgende Speichermodelle Name Programmcode Daten TINY zusammen 64 kB SMALL bis zu 64 kB bis zu 64 kB MEDIUM mehr als 64 kB bis zu 64 kB COMPACT bis zu 64kB mehr als 64 kB LARGE mehr als 64 kB mehr als 64 kB HUGE mehr als 64 kB mehr als 64 kB F r das Laden eines Zeigers in einem Schritt gibt es zwei Spezialbefehle LDS und LES F r das Speichern von Zeigern gibt es keine Spezialbefehle 28 KAPITEL 2 ORGANISATION UND BENUTZUNG DES HAUPTSPEICHERS Speichermodell HUGE unterscheidet sich von LARGE dadurch dall es einzelne Datenbereiche mit einer Gr fe von mehr als 64 kB unterst tzt Die g
130. mfassen meist 8 16 oder 32 Bit Eine Einheit aus 4 Bit hei t Tetrade oder Nibble eine 8 Bit Einheit hei t Byte Ein Wort ist eine Dateneinheit die die gleiche Gr e hat wie das Hauptrechenregister des Prozessors In der Welt der intel x86 Prozesoren wird h ufig mit einem Wort eine 16 Bit Einheit gemeint weil der intel 8086 16 Bit Allzweckregister hat In diesem Zusammenhang ist ein Doppelwort dann eine 32 Bit Einheit Wichtig ist dass eine Hexadezimale Ziffer gerade 4 Bit darstellt ein Byte also genau durch zwei Hexziffern dargestellt wird usw Innerhalb einer Einheit sind die Bits nummeriert Das niederwertigste Bit das Least significant Bit abgek rzt das LSB ist immer Bit 0 Das h chstwertige Bit das Most significant Bit abgek rzt das MSB ist bei einem Byte Bit 7 bei einem 16 Bit Wort Bit 15 und bei einem 32 Bit Wort Bit 31 14 KAPITEL 1 EINF HRUNG L Flag 1 Bit H herwertiges Niederwertiges Nibble Nibble 765432710 Byte 8 Bit H herwertiges Niederwertiges Byte Byte DAN E je ao 4 A pr ug E De 15 14 13 12 11 10 98 7 6 5 4 3 21 0 Wort 16 Bit H herwertiges Niederwertiges Wort Wort EN 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 54 3 2 1 0 Doppelwort 32 Bit Abbildung 1 2 Die Dateneinheiten des intel 80386 Flags Bytes Worte und Doppelworte 1 2 3 Die Reihe der intel 80x86 Prozessoren Im Jahre 1985 brachte intel den 8086 Prozessor auf den Markt
131. mit MaxPixelNr ja Fehler jump if above gt Fehler Springe zu Marke Fehler wenn dx gr er mov Fehlerflag O0 jmp Verzweigungsende Fehler mov Fehlerflag 1 Verzweigungsende Bei den Schleifen muss man zwei Hauptvarianten unterscheiden Nicht abweisende Schleifen Die Abbruchbedingung wird erst nach der ersten Ausf hrung gepr ft die Schleife wird mindestens einmal ausgef hrt C do while Abweisende Schleifen Die Abbruchbedingung wird schon vor der ersten Ausf hrung gepr ft m glicherweise wird die Schleife gar nicht ausgef hrt C while oder for Die Abbruchbedingungen der Schleifen k nnen das Erreichen eines bestimmten Z hlwertes sein Z hlschleifen oder datenabh ngig formuliert werden Die Grundkonstruktion der nicht abwei senden Schleife kann folgenderma en aussehen Initialisierung der Schleife 62 KAPITEL 7 SPRUNGBEFEHLE Schleifenstart Schleifenrumpf Befehle Schleifenbedingung aktualisieren z B Z hlwert ndern und auswerten bedingter Sprung zu Schleifenstart Als Beispiel betrachten wir die Initialisierung eines Wort Feldes mit Nullworten in einer Z hl schleife mov si 0 mov bx offset feld Schleifenstart mov bx si O 0 in Feld schreiben add si 2 um 2 erh hen da Wortfeld cmp si 256 jne Schleifenstart Die Grundkonstruktion der abweisenden Schleife sieht wie folgt aus Initialisierung der Schleife Schleifenstart Schleifenbedingung aktualisieren z B Z hlwert
132. mit n Bit insgesamt die Zahlen von 0 bis 2 1 darstellen bei 8 Bit z B 0 bis 255 Zahlen ausserhalb dieses Bereichs sind nicht darstellbar und eine Operation deren Ergebnis ber eine der Grenzen hinaus f hrt ergibt ein falsches Ergebnis Diese Bereichs berschreitung wird vom Mikroprozessor mit dem bertragsflag Carryflag angezeigt Dagegen wird bei einem berlauf s u auf das h chstwertige Bit zwar das berlaufsflag gesetzt dies bedeutet hier aber keinen Fehler ein Beispiel daf r ist 127 1 128 bei 8 Bit Zahlen Bei einer Bereichs berschreitung landet man also nach der gr ten darstellbaren Zahl wieder bei Null bzw umgekehrt Das erinnert an einen Ring oder eine Uhr und man kann tats chlich den Zahlenbereich bei ganzen Zahlen sehr anschaulich durch den sog Zahlenring darstellen Um einen Zahlenbereich zu erhalten der auch negative Zahlen erlaubt werden die Zahlen im Zweierkomplement signed binary numbers dargestellt Dabei gibt es nur einen Unterschied zu den vorzeichenlosen Bin rzahlen Die h chstwertige Ziffer wird negativ gewichtet also n 2 Z an1 143 2 8 2 1 0 8 1 DIE DARSTELLUNG VON GANZEN ZAHLEN 67 Bitmuster Wert dezimal 11111101 253 11111110 254 11111111 259 00000000 0 00000001 1 00000010 2 00000011 3 Tabelle 8 1 Der bertrag bei Bin rzahlen am Beispiel der 8 Bit Zahlen Bsp Die Operati on 255 1 f hrt zu dem falschen Ergebnis 0 der Fehler wird durch das bertragsflag
133. n Problem kann sich ergeben wenn die Anzahl der Schleifendurchg nge also der Startwert in ECX variabel gehalten ist CX ECX 0 wird ja vor der berpr fung auf 0 dekrementiert Es ergibt sich also im ersten Durchgang ein Wert von OFFFFh in CX oder sogar OFFFFFFFFh in ECX Die Schleife wird dann ausgef hrt bis der Wert zu 0 geworden ist also 216 bzw 23 mal Dies ist in der Regel ungewollt Um das Problem zu vermeiden gibt es einen speziellen Sprungbefehl jexz jump if cx zero und jecxz jump if ecx zero wird ausgef hrt wenn CX 0 bzw ECX 0 ist 7 4 2 Loope Loopz Der Befehl Loope Loop while equal gleichwertig kann loopz loop while zero benutzt werden macht den Sprung von zwei Bedingungen abh ngig e CX ungleich 0 e zf 1 Nur wenn beide Bedingungen erf llt sind wird der Sprung ausgef hrt Anders ausgedr ckt Die Schleife wird abgebrochen wenn CX 0 oder zf 0 ist Loope Loopz stellt also f r die Schleife ein zweites Abbruchkriterium zur Verf gung Dies setzt voraus dass innerhalb des Schleifenrumpfes mindestens ein Befehl ausgef hrt wird der das Zeroflag setzt l scht z B ein bitweise logischer oder arithmetischer Befehl 7 4 3 Loopne Loopnz Der Befehl Loopne Loop while not equal gleichwertig kann loopnz loop while not zero benutzt werden macht den Sprung ebenfalls von zwei Bedingungen abh ngig 64 KAPITEL 7 SPRUNGBEFEHLE e CX ungleich 0 e z 0 Nur wenn beide Bedingungen erf llt sind wird d
134. n nicht mehr laufen In solchen F llen mu in Assemblerprogrammen ein Betriebssystemaufruf kurz Systemauf ruf durchgef hrt werden Solche Betriebssystemaufrufe kommen daher im Ablauf fast aller Assemblerprogramme vor zumindest jedoch am Programmende wo die Kontrolle mit einem Systemaufruf wieder an das Betriebssystem zur ckgegeben wird Wir wollen die Verh ltnisse am Beispiel eines PC unter DOS n her betrachten Der unmittelbare Zugriff auf die Hardware Komponenten erfolgt ber das sog Basic Input Output System das BIOS Das BIOS ist eine Sammlung von Unterprogrammen um die Bausteine des Rechners direkt anzusteuern z B die Grafikkarte die Laufwerke die Schnittstellen den Speicher die Uhr u a m Das BIOS ist in einem EPROM gespeichert einem Festwertspeicher auf der Hauptplatine Es ist nach dem Einschalten des PC sofort verf gbar DOS steht f r Disk Operating System und ist z B verf gbar als MS DOS oder PC DOS DOS ist das eigentliche Betriebssystem es bernimmt die Aufgabe Programme zu starten und zu stoppen Laufwerke und Dateisysteme zu verwalten Ger te zu steuern Treiber einzubinden u a m DOS nimmt dazu Funktionen des BIOS in Anspruch Ebenfalls m glich sind direkte Hardwarezugriffe ber I O Adressen oder direkt adressierte Spei cherpl tzen Dies sollte aber eigentlich der Systemprogrammierung vorbehalten sein und bei Anwenderprogrammen eine Ausnahme bleiben Einen berblick gibt Abb 5 1 Wie sind nun BIOS u
135. nach links oder rechts zu schieben Dabei wird an einem Ende ein Bit herausfallen Wenn dieses herausgefallene Bit am anderen Ende der Datenstruktur wieder eingesetzt wird spricht man von Rotation sonst von Schieben Shift Das bearbeitete Bitmuster kann in einem Register oder im Hauptspeicher liegen und 8 16 oder 32 Bit umfassen Im folgenden Beispiel wird ein Bitmuster um ein Bit nach rechts geschoben mov al 11000110b shr al 1 shift right al 1 in al steht nun 01100011b 63h Die Syntax umfasst immer zwei Operanden Das zu bearbeitende Bitmuster und die Anzahl Bits die geschoben oder rotiert werden soll Die Bitzahl kann eine Konstante sein oder in CL stehen Konstanten gr er 1 erst ab 80286 Schiebe Rotationsbefehl Reg Mem Konstante CL Im folgenden sollen die acht Varianten der Schiebe und Rotationsbefehle kurz betrachtet werden Allen gemeinsam ist dass das letzte herausgefallene Bit ins Carryflag geschrieben wird 54 KAPITEL 6 BITVERARBEITUNG SHL Shift Left SHR Shift Right Einfaches Schieben nach links oder rechts die frei werdenden Bitstellen werden mit einer Null aufgef llt F r Bin rzahlen gilt ja Das einfache Schieben um ein Bit nach links entspricht einer Multiplikation mit zwei nach rechts einer Division durch zwei Man kann also mit den Schiebebefehlen sehr gut 2 und 2 rechnen SHL und SHR funktioniert allerdings nur bei vorzeichenlosen Zahlen SAL Shift Arithmetic Left SAR Shift Arithmet
136. nach rechtsllinks Beschreibung s SAR SAL SAR SAL Shift arithmetic right left Arithmetisches Schieben nach rechts links Syntax Flags Beschreibung Beispiele SAR SAL Operand Anzahl Operand reg8 16 32 mem8 16 32 Anzahl 1 CL OJ S Z P C Schiebt Shiftet den Operanden um eine oder mehrere Stellen bitwei se nach rechts links SAL ist identisch mit SHL Der Befehl bertr gt das MSB ins CF das freiwerdende LSB wird mit O besetzt SAR unterscheidet sich von SHR Bei SHR wird das LSB ins CF bertragen und MSB wird mit O besetzt Bei SAR wird MSB unver ndert belassen und auf die benachbarte Stelle kopiert LSB wird ins CF bertragen Als Anzahl kann entweder 1 oder CL angegeben werden Im ersten Fall wird einmal um ein Bit geschoben im zweiten Fall so oft wie der Inhalt von CL vorgibt OF ist im zweiten Fall undefiniert SHR und SHL k nnen verwendet werden um an einer vorzeichenlosen Zahl eine Multiplikation bzw Division mit durch 2 4 8 durchzuf hren SAR und SAL k nnen verwendet werden um an einer vorzeichenbehaf teten Zahl eine Multiplikation bzw Division mit durch 2 4 8 durch zuf hren S auch ROR ROL RCR RCL SHL BX 1 BX wird mit 2 multipliziert gleichwertig SAL BX 1 MOV CL 4 16 4 SCHIEBE UND ROTATIONSBEFEHLE 137 SHR spalte CL spalte vorzeichenlos durch 16 teilen Divisionsrest ist unbehandelt SAR dif
137. nd DOS realisiert und welche Schnittstellen bieten sie dem Anwendungspro grammierer Die Intel Prozessoren unterst tzen hardwarem ig einen Satz von sehr systemna hen Unterprogrammen die nicht ber Adressen sondern ber Nummern zwischen 0 und 255 In Hochsprachenprogrammen werden diese Systemaufrufe ebenfalls durchgef hrt Sie bleiben allerdings meist unbemerkt weil der Compiler die notwendigen Aufrufe automatisch erzeugt 44 5 1 ALLGEMEINES 45 Anwendungsprogramme DOS Disk Operating System z B MS DOS Int 21h Int 20h und Int 22h Int 33h BIOS Basic Input Output System Int 10h bis Int 1Fh Hardware Grafikkarte Speicher Tastatur Maus serielle Schnittstelle parallele Schnittstelle Netzwerkkarte Uhrenbaustein Abbildung 5 1 Betriebssystemaufrufe und Ansteuerung der Hardware unter DOS aufgerufen werden die Interrupts Die Adressen dieser Unterprogramme stehen in der sog Interrupt Vektoren Tabelle und werden beim Aufruf eines Interrupts automatisch vom Pro zessor geladen Die Nummern der Interrupts werden blicherweise hexadezimal genannt Die Interrupts k nnen in f nf Gruppen eingeteilt werden 1 Interrupts die der Prozessor selbst in Ausnahmesituationen ausl st die sog Exceptions bzw Ausnahmen 2 Interrupts die durch externe Ereignisse hardwarem ig ausgel st werden und das laufende Programm unterbrechen gt Name 3 BIOS Aufrufe 4 DOS Aufrufe 5 Interrupts die frei
138. nd Operand2 aus das Ergebnis wird im Zieloperand abgelegt Die Bit operationen sind e AND logisches UND Ergebnisbit 1 wenn beide Operanden bits 1 sonst Ergebnisbit 0 e OR logisches ODER Ergebnisbit 1 wenn mindestens eines der beiden Operandenbits 1 sonst Ergebnisbit 0 e XOR logisches exklusives ODER Ergebnisbit 1 wenn die Summe der beiden Operandenbits 1 ist sonst Ergebnisbit 0 Beispiele AND AL 01111111b Im Register AL Bit 7 l schen OR Maske 00000100b In Variable Maske Bit2 1 setzen XOR Maske OFOh high nibble invertieren low nibble bleibt TEST Test Testen Syntax TEST Operand1 Operand2 Operandi reg8 16 82 mem8 16 32 Operand2 reg8 16 82 mem8 16 32 Direktoperand Flags OJ IS IZ IPI C Hiervon werden OF und CF immer gel scht Beschreibung Dieser Befehl unterscheidet sich von AND nur dadurch da Operand1 nicht ver ndert wird Beispiele TEST AL 00000010b feststellen ob im Register AL das Bit 1 gesetzt ist dann ist ZF 0 136 KAPITEL 16 ASSEMBLERBEFEHLE NACH GRUPPEN 16 4 Schiebe und Rotationsbefehle Shift right Shift left SHR SHL Schieben nach rechts Schieben nach links Syntax SHR SHL Operand Anzahl Operand reg8 16 32 mem8 16 32 Anzahl 1 CL Flags OJ IS IZ IPI 1C Beschreibung Sch cht Shiftet den Operanden um eine oder mehrere Stellen bitweise Beispiele s
139. nd ersetzt die Befehlsfolge DEC ECH JNZ Sprungmarke LOOPE LOOPNE LOOPZ LOOPNZ JCXZ Beispiele Warteschleife mit NOP Befehlen No Operation Procedure Warten Parameter ECX Anzahl der Warteschleifen R ckgabe keine JCXZ L2 Prozedur verlassen wenn CX 0 L1 NOP LOOP L1 Warteschleife L2 return Loope while equal Zero LOOPE LOOPZ 00 00 Schleife solange gleich Null Syntax LOOPE LOOPZ label short label short Label im Bereich 128 bis 127 Byte Flags Beschreibung Befehl dekrementiert ECX und springt zur angegebenen Marke falls 1 ECX 0 2 ZF 1 Der Befehl dient der einfachen Konstruktion von Schleifen mit zwei Ab bruchkriterien Siehe auch LOOP LOOPNE LOOPNZ Beispiele s LOOPNE Loope while not equal not Zero LOOPNE LOOPNZ Schleife solange ungleich nicht Null Syntax LOOPNE LOOPNZ label short label short Label im Bereich 128 bis 127 Byte 154 KAPITEL 16 ASSEMBLERBEFEHLE NACH GRUPPEN Flags Beschreibung Befehl dekrementiert ECX und springt zur angegebenen Marke falls 1 ECX 0 2 ZF 0 Der Befehl dient der einfachen Konstruktion von Schleifen mit zwei Ab bruchkriterien Siehe auch LOOP LOOPNE LOOPNZ Beispiele Suche nach einem Punkt in einem Dateinamen Abbruch wenn Punkt gefunden oder 8 Zeichen untersucht DI zeigt auf Dateinamen MOV CX 8 L1 CMP DI Zeichen INC DI Zeiger weiterruecken LOOPNE L1 Schleife 12 re
140. nicht ver wertet acht Byte vom Stack entfernen Zeile 25 Division einer Flie kommazahl durch drei Koprozessorbefehle fld Laden der Varia blen fdiv Division fstp Speichern Zeile 27 R ckgabewert von main ist Null und kommt nach EAX Zeile 28 Abbau des Stackframes RET Befehl 13 5 STEUERUNG DER KOMPILIERUNG 101 13 5 Steuerung der Kompilierung 13 5 1 Aufrufkonventionen Aufrufkonventionen bestimmen wie die Parameter bergabe an Funktionen gestaltet wird In dem folgenden Beispiel wird eine Funktion mit drei verschiedenen Aufrufkonventionen bersetzt Beispiel f r die Wirkung von Aufrufkonventionen Segment und andere Direktiven weggelassen default Aufrufkonvention _cdecl Stack Parameter bergabe 7 Reihenfolge von rechts nach links aufrufende Funktion r umt Stack auf _a 8 _b 12 _aminusb 4 idifferenz1 0CYAHHHCZ PROC NEAR idifferenzi 9 int idifferenzi int a int b 4 push ebp mov ebp esp push ecx 4 int aminusb 55 aminusb a b mov eax DWORD PTR _a ebp sub eax DWORD PTR _b ebp mov DWORD PTR _aminusb lebp eax 6 return aminusb mov eax DWORD PTR _aminusb ebp 57 gt mov esp ebp pop ebp ret 0 idifferenz1 CYAHHHCZ ENDP idifferenzi Aufrufkonvention _stdcall 7 Stack Parameter bergabe Reihenfolge von rechts nach links aufgerufene Funktion r umt Stack auf _a 8 _b 12 _aminusb 4 idifferenz200CYGHHHCZ
141. nt Variable ST 0 ST 0 int Variable SENDE 11 3 BEFEHLSSATZ 87 Hierbei darf fp Variable eine Gleitkomma Speichervariable mit 32 oder 64 Bit sein und int Variable eine Integer Speichervariable mit 16 oder 32 Bit Einen berblick ber die arithmetischen Befehle und ihre Wirkung gibt die folgende Tabelle FADD Ziel Ziel Quelle FSUB Ziel Ziel Quelle FMUL Ziel Ziel Quelle FDIV Ziel Ziel Quelle FSUBR Ziel Quelle Ziel FDIVR Ziel Quelle Ziel Bei den beiden letzten Befehlen steht R f r Reverse weil die Operanden getauscht sind F r alle Befehle in dieser Liste gibt es die oben gezeigten Varianten also z B FMUL FMULP FIMUL usw Dazu kommen weitere Befehle wie z B FABS Bildet den Absolutwert von ST 0 FCHS ndert das Vorzeichen von ST 0 FSQRT Zieht die Quadratwurzel aus ST 0 11 3 4 Trigonometrische Befehle Diese Befehle f hren m chtige mathematische Berechnungen durch um trigonometrische lo garithmische oder exponentielle Funktionen zu berechnen Vor Aufruf der trigonometrischen Funktionen muss das Argument im Bogenmass in ST 0 hinterlegt werden Die Funktionen sind FSIN ST 0 Sinus Argument FCOS ST 0 Cosinus Argument FSINCOS ST 0 Sinus Argument ST 1 Cosinus Argument FPTAN partieller Tangens ST 0 X ST 1 Y Y X tan Argument FPATAN partieller Arcustangens ST 0 arctan ST 1 ST 0 F r die Berechnung von Potenzen gibt es die folgenden Exponentialfunktionen FYL2X 0 Y
142. ort wird auch von Halbworten Doppelworten und Quadworten vier Maschinenworte gesprochen bei einem 16 Bit Prozessor umfasst ein Quadwort 64 Bit F r die Darstellung auf Papier oder Bildschirm wird in der Regel die Hexadezimale Darstellung gew hlt dabei stellt jede Hexadezimalziffer 4 Bit dar Ein Byte kann also immer mit 2 Hexziffern dargestellt werden Um Verwechslungen zu vermeiden benutzt man Anh nge die das verwendete Zahlensystem kennzeichnen b bin r d dezimal h hexadezimal Das niedrigstwertige Bit innerhalb eines Bytes oder Wortes hei t least significant bit LSB das h chstwertige hei t most significant bit MSB Die Nummerierung der Bits innerhalb eines Bytes oder Wortes beginnt immer beim LSB mit 0 s Tab 14 4 F r gr ere Informationsein heiten gibt es gebr uchliche Abk rzungen die an die Einheitenvors tze der Naturwissenschaften angelehnt sind wie z B das kiloByte s Tab 14 5 14 2 Die DOS Kommandozeile zur ck in die Steinzeit Bei den praktischen bungen mit Assemblerprogrammen benutzt man evtl die Kommandozeile unter MS DOS Dabei stehen nicht die gewohnten grafischen Windows Tools zur Verf gung 14 2 DIE DOS KOMMANDOZEILE ZUR CK IN DIE STEINZEIT 121 210 Byte ein Kilobyte 1kB 1024 Byte 1024 Byte 220 Byte ein Megabyte 1MB 1024kB 1048576 Byte 230 Byte ein Gigabyte 1GB 1024 MB 1073741824 Byte 240 Byte ein Terabyte 1 TB 1024 GB 1099511627776 Byte Tabelle
143. piele direktes Schreiben in den Bildschirmspeicher MOV AX 0B800h Segmentadresse des MOV ES AX Bildschirmspeichers nach ES MOV DI O DI 0 gt linke obere Ecke MOV AL 707 Zeichen MOV AH 49h Attribut MOV CX 80 Anzahl 80 CLD DF 0 steigende Adressen REP STOSW repeat store string word Schleife REPE REPNE l Repeat while equallnot equal Wiederholen solange gleich ungleich Syntax REPE REPNE Stringbefehl Stringbefehl SCAS CMPS Flags Beschreibung REPE REPNE identisch sind REPZ REPNZ sind keine eigenst ndige Befehle sondern Wiederholungspr fixe und m ssen vor einem der Stringbefehle SCAS oder CMPS stehen REPE REPNE bewirkt da nach jeder Ausf hrung des nachstehenden Stringbefehls CX dekrementiert und falls CXZ0 der Stringbefehl erneut ausgef hrt wird Man hat also eine Z hlschleife wie bei REP Hier existiert aber ein zweites Abbruchkriterium n mlich die Gleichheit Ungleichheit der Operanden e REPE Schleifen werden bei Ungleichheit der Operanden abgebro chen d h wenn ZF 0 e REPNE Schleifen werden bei Gleichheit der Operanden abgebro chen d h wenn ZF 1 REPE SCAS CMPS Beispiele Aufsuchen eines Zeichens A mit Attribut 07h im Bildschirmspeicher MOV AX OB800h Segmentadresse des MOV ES AX Bildschirmspeichers nach ES MOV DI O DI 0 gt linke obere Ecke MOV AL A Zeichen MOV AH 07h Attribut 152 KAPITEL 16 ASSEMBLERBEFEHLE NACH GRUPPEN MOV CX 2000 25 80 2000 Worte CLD DF
144. pricht der Multiplika tion mit 4 Alternativ kann ein Multiplikationsbefehl benutzt werden soweit vorhanden Uberlauf ist hier unbericksichtigt e Addiere Inhalt von Arbeitsregister 2 zu Arbeitsregister 1 entspricht jetzt 5 B e Inkrementiere Arbeitsregister 1 e Speichere Inhalt von Arbeitsregister 1 in Speicherzelle A F r jede dieser Aktionen muss ein Maschinenbefehl zur Verf gung stehen Wenn dann alle Ak tionen als Maschinenbefehle formuliert sind nennt man dieses Programmst ck Maschinencode Wie sieht nun Maschinencode aus Maschinenbefehle sind einfach bin re Bitmuster in Einheiten zu 8 Bit d h Bytes Maschinencode ist also eine lange Folge von Einsen und Nullen z B 10100001 00000000 00101010 10001011 11011000 usw Die bin re Schreibweise nimmt zu viel Platz weg man schreibt solche bin ren Daten fast immer hexadezimal auf Die hexadezimale Schreibweise passt hier sehr gut denn eine Hexadeziamlziffer stellt gerade 4 Bit dar zwei Hexadezimalziffern also ein Byte Unser Maschinencode sieht dann so aus A100 2A 8B D8 C1 E0 02 03 C3 40 A3 00 28 Diese Maschinenbefehle stehen dann im ausf hrbaren Programm z B als EXE Datei Zur Ausf hrung werden sie in den Speicher gebracht geladen und der Prozessor holt sich die Ma schinenbefehle nacheinander aus dem Speicher Jedes Byte wird dabei auf seine Bedeutung hin analysiert dekodiert und wenn ein g ltiger Maschinenbefehl erkannt wurde wird er ausgef hrt Wenn man das
145. push ax dec cx cmp cx 0 jne mult mov di 0 vom_stack_holen pop ax mov Feld tdi ax SU KAPITEL 9 STACK UND STACKBEFEHLE add di 2 cmp di 20 jbe vom_stack_holen Kommentieren Sie diesen Programmabschnitt L sungen auf Seite 130 Kapitel 10 Unterprogramme Unterprogramme engl Procedures oder Subroutines sind notwendig um gute Assemblerpro gramme zu schreiben Die Gr nde daf r sind e Die Ablaufsteuerung f r Teilaufgaben ist zentral und nur einmal vorhanden e Gute Unterprogramme sind modular und unterst tzen die Wiederverwendung e Eine unn tige Aufbl hung des Maschinencodes wird vermieden e Die bersicht wird verbessert e Unterprogramme stellen gute Schnittstellen zu Hochsprachen dar Mit dem Aufruf des Unterprogramms CALL verzweigt der Programmablauf ins Unterpro gramm Das Unterprogramm endet mit dem Return Befehl RET Dieser bewirkt dass die Ausf hrung mit dem n chsten Befehl der auf CALL folgt fortgesetzt wird Bei den meisten Unterprogrammen werden Informationen mit dem rufenden Programm ausgetauscht Das Un terprogramm wird durch Parameter gesteuert und liefert Ergebnisse an das rufende Programm zur ck Unterprogramme k nnen ihrerseits wieder Unterprogramme aufrufen Da Unterprogram me mit den gleichen Register arbeiten m ssen wie das rufende Programm k nnen nach dem Unterprogramm Register ver ndert sein Im folgenden Beispiel bildet ein Unterprogramm den Mittelwert aus AX und BX und gibt i
146. r Erleichterung des Lesens wird dabei folgende einfache Typographie eingehalten e Bezeichnungen die w rtlich bernommen werden m ssen wie z B Befehlsnamen sind in Schreibmaschinenschrift geschrieben abstrakte Bezeichnungen die noch durch konkrete Angaben ersetzt werden m ssen sind kursiv geschrieben Alternativen sind durch einen senkrechten Strich getrennt Optionale Teile sind in eckige Klammern gesetzt Bei der Beschreibung jedes Befehls ist ein einheitliches Format eingehalten In einer Kopfzei le ist das Mnemonic des Befehls das vollst ndige engl Befehlswort und dessen bersetzung angegeben z B Compare CMP Vergleichen In den beiden n chsten Zeilen sind die Syntax des Befehls und die erlaubten Operanden be schrieben z B Syntax CMP Operand1 Operand2 Operandl reg8 16 32 mem8 16 32 Operand2 reg8 16 32 mem8 16 32 Dabei steht reg8 16 32 f r Registeroperanden mit 8 16 oder 32 Bit wie z B AL bzw AX und mem8 16 32 f r Speicheroperanden mit 8 16 oder 32 Bit Manche Befehle erlauben einen Direktoperanden d h eine Zahl im Bin r Oktal Dezimal oder Hexadezimalformat 131 132 KAPITEL 16 ASSEMBLERBEFEHLE NACH GRUPPEN In der n chsten Zeile werden die Flags des Prozessorstatusworts aufgef hrt die von dem Befehl ver ndert werden In unserem Beispiel sind dies Flags OJ IS IZ JA P IC Danach folgt eine knappe Beschreibung der Funk
147. r Ersatzkonstruktio nen gleich sein stack balancing 9 2 Stack berlauf Wenn durch mehrere PUSH Befehle das SP Register den Wert 0 erreicht hat bewirkt ein wei terer PUSH Befehl einen Stack berlauf Dabei werden fehlerhafterweise daten berschrieben entweder im Stacksegment oder in einem anderen Segment 9 3 Anwendungsbeispiele Eine typische Anwendung ist das tempor re Zwischenspeichern von Daten Beachten Sie im folgenden Beispiel die Reihenfolge der PUSH und POP Befehle push dx dx zwischenspeichern push ax ax zwischenspeichern mov dx offset Meldung dx wird gebraucht mov ah 09 9 4 TESTFRAGEN 79 int 21h pop ax ax erh lt wieder den alten Wert pop dx dx erh lt wieder den alten Wert Manchmal kann auch ein Transport von Daten gut ber den Stack abgewickelt werden Im folgenden Beispiel soll der Inhalt von DS nach ES kopiert werden Dies kann geschehen durch mov ax ds DS kann nicht direkt nach ES kopiert werden mov es ax AX ist ver ndert Das gleiche kann auch ber den Stack als Zwischenstation geschehen push ds Keine anderen Register werden ver ndert pop es Die Benutzung des Stack erlaubt z B auch beliebig tief geschachtelte Schleifen die alle mit dem Register CX z hlen 9 4 Testfragen 1 push di push dl push fs push edi Welche Befehle sind fehlerhaft 2 push 8 push 9 push 10 pop ax pop bx pop cx Welchen Inhalt haben die Register ax bx cx 3 mov cx 10 mult imul ax 2
148. rammierer ausrechenbar vom Betriebssystem verwaltet f r Programmierer unbekannt Paging C Datentyp char unsigned char 8 Bit 8 Bit C Datentyp short unsigned short 16 Bit 16 Bit C Datentyp int unsigned int 16 Bit 32 Bit C Datentyp long unsigned long 32 Bit 32 Bit C Datentyp float 32 Bit 32 Bit C Datentyp double 64 Bit 64 Bit Push Pop 16 Bit 32 Bit Betriebssystemanbindung Int 21h Intxxh Call Bibliotheksfunktion 13 3 Aufbau und Funktion des Stack Der Stack dient in C Programmen drei Zwecken e bergabe von Parametern e Speicherung der R cksprungadresse bei Funktionsaufrufen e Speicherung von lokalen Variablen Beim Aufruf einer Funktion kommen diese Daten auch gerade in dieser Reihenfolge auf den Stack Die einzelnen Schritte sind k nnen in dem Beispielprogramms auf im folgenden Abschnitt sehr sch n im Code verfolgt werden und sind dort auch kommentiert Die nachfolgend dargestellten Punkte sind im Code und den Kommentaren zu den Zeilen 3 7 22 23 und 28 im Detail zu sehen Parameterablage Das rufende Programm legt zun chst die zu bergebenden Parameter standardm ig von rechts nach links auf dem Stack ab Code und Kommentar zu Zeilen 22 und 23 13 4 ERZEUGUNG VON ASSEMBLERCODE DURCH COMPILER 97 Funktionsaufruf Der Aufruf der Funktion wird durch CALL durchgef hrt dabei legt der Prozessor die Riicksprungadresse auf den Stack Code und Kommentar zu Zeilen 22 und 23
149. randen sein Die letzte Einschr nkung gilt brigens f r alle 80x86 Befehle Die M glichkeiten des MOV Befehles sind in Abb 4 grafisch dargestellt Bei Direktoperanden erweitert der Assembler in MOV Befehlen bei der bersetzung automatisch die Bitbreite passend f r den Zieloperanden mit Nullbits So wird z B aus dem Befehl mov ax 1 im Maschinencode der Befehl mov ax 0001h Operationen die nicht in einem MOV Befehl ausgef hrt werden k nnen m ssen in zwei Schrit ten erledigt werden z B der Transport eines Direktwertes in ein Segmentregister Nur die Stringbefehle s Kap 16 9 k nnen zwei Speicheroperanden ansprechen diese werden dann aber nicht als Operanden genannt 38 3 2 DATEN AUSTAUSCHEN XCHG 39 Direktwert Konstante Register EAX EBX ECX EDX Speicher L ck EDI ESI EBP ESP auch Teilgruppen Segmentregister DS CS SS ES FS GS Abbildung 3 1 M glichkeiten des MOV Befehls Ziel und Quelloperand m ssen gleiche Bitbreite haben mov ax 200h mov es ax Eine hnliche Sequenz findet man am Anfang des obigen Beispielprogrammes und am Anfang aller anderen Programme 3 2 Daten austauschen XCHG Mit dem Befehl XCHG Exchange k nnen Daten zwischen zwei Operanden ausgetauscht werden z B zwischen zwei Registern oder zwischen Register und Speicher Die Syntax des Befehles ist XCHG Operand1 Operand2 So kann z B der Inhalt der Register EAX und EDX durch xchg eax edx ausget
150. re Adressen I O Portadressen Durch die Verwendung von IN und OUT ist sichergestellt dass nicht auf den Speicher sondern auf die I O Ports zugegriffen wird Da Ein und Ausgaben viel seltener sind als Hauptspeicherzugriffe hat man hierbei viel weniger Komfort als bei letzteren F r beide Befehle muss die I O Portadresse im Register DX hinterlegt werden Ist diese Adresse allerdings kleiner als 100h also max FFh so kann sie als Direktoperand im IN oder OUT Befehl genannt werden Der IN und OUT Befehl kann in 8 16 oder 32 Bit Breite ausgef hrt werden Ziel bzw Quellregister ist AL AX oder EAX je nach Bitbreite Beispiele 1 Senden eines Zeichens ber die serielle Schnittstelle COM1 mov dx 3F8h IO Portadresse von COM1 gr er als FFh out dx al Byte in AL am COM1 Baustein bergeben wird gesendet 2 Einlesen der Interrupt Enable Mask vom Interrupt Controller in al 20h IO Adresse des Interruptcontrollers ist 20h also kleiner als FFh 43 Kapitel 5 Betriebssystemaufrufe 5 1 Allgemeines Die Assemblersprache verf gt im Gegensatz zu Hochsprachen nicht ber komplexe Befeh le um Bildschirmausgaben Dateizugriffe Bedienung von Schnittstellen u a m durchzuf hren Wenn man dabei direkt auf die Hardware zugreifen wollte h tte man gro e Probleme Man brauchte sehr gute Hardwarekenntnisse die Programme w ren extrem aufwendig und vor al lem hardwareabh ngig So w rden viele Programme auf neueren Rechner
151. rein sequentielle Lesen unterbricht und stattdessen an einer anderen Stelle mit dem Einlesen fortf hrt wird das Sprung genannt Durch Spr nge kann man Wiederholungen und Verzweigungen die Grundelemente jeder Programmierung realisieren Zum Befehlssatz je des Prozessors geh ren daher auch Sprungbefehle In den Maschinencode sind auch Operanden d h Daten die direkt zum Befehl geh ren eingef gt Theoretisch k nnte man also mit Maschi nencode Programme entwickeln aber das macht man nur in Notf llen Maschinencode hat doch einige schwere Nachteile e Die Programme sind sehr schlecht lesbar man kann die Befehle nicht erkennen und keine Namen f r Variablen und Sprungmarken vergeben e Die Programme sind sehr unflexibel nach dem Einf gen von zus tzlichen Befehlen m te man alle Sprungbefehle anpassen e Es k nnen keine Kommentare eingef gt werden 10 KAPITEL 1 EINF HRUNG Diese Nachteile werden behoben durch die Einf hrung der Assemblersprache In der Assembler sprache wird jeder Maschinenbefehl durch eine einpr gsame Abk rzung mit typ 3 Buchstaben dargestellt das sog Mnemonic Die Assemblersprache wird dadurch relativ leicht lesbar und verst ndlich stellt aber trotzdem ein vollst ndiges Abbild des Prozessors dar F r jede Opera tion die der Prozessor durchf hren kann gibt es einen zugeh rigen Assemblerbefehl Beispiele f r Mnemonics d h Assemblerbefehle sind ADD f r Addition SHL f r Shift left MOV f r
152. rgebnisregister zu klein ist f r das Ergebnis sonst OF CF 0 Hier zeigen die gesetzten Flags also einen ernsthaften Fehler an Ein gute Empfehlung f r die Praxis sind die Varianten von IMUL mit zwei Operanden Man kann positive und negative Zahlen bis ca 2 Milliarden berechnen und die Syntax ist hnlich zu vielen gewohnten Befehlen Beispiele Berechnung von 655 76 mov cx 76 mov bx 655 imul bx cx jc Fehler reichen 16 Bit f r das Ergebnis Berechnung von 2000h 32 Bit Speichervariable mov eax 2000h imul eax Var32 jc Fehler reichen 32 Bit f r das Ergebnis 8 4 Division Der Divisionsbefehl arbeitet mit festen Registern Als Operand wird nur der Divisor Teiler genannt Dividend Das Geteilte und Ergebnisregister sind fest also implizite Operanden Dabei wird immer vorausgesetzt dass das Ergebnis nur halb so viele Bits umfasst wie der Dividend Das Ergebnisregister hat daher nur halb so viele Bit wie der Dividend Ergibt die Rechnung ein zu gro es Ergebnis so ereignet sich ein Divisionsfehler der den Prozessor in einen sog Ausnahmezustand versetzt Der dadurch aufgerufene Exception Handler beendet in der Regel das Programm Divisionsfehler k nnen leicht passieren wenn durch kleine Zahlen geteilt wird Division durch Null f hrt immer zum Divisionsfehler Bei der Division entstehen zwei Resultate Ein ganzzahliges Divisionsergebnis und ein ganz zahliger Divisionsrest F r die Division vorzeichenloser Z
153. s nur wenn nicht gleichzeitig auch ein bertrag entsteht und Mikroprozessoren setzen auch nur dann das berlaufllag Betrachten wir wieder einen Ausschnitt aus dem Zahlenbereich der 8 Bit Zahlen im Zweierkomplement KAPITEL 8 ARITHMETISCHE BEFEHLE Abbildung 8 1 Der Zah lenring f r die vorzeichen losen 4 Bit Zahlen Die Be reichs berschreitung wird durch 4 das bertragsflag Carry angezeigt 4 Abbildung 8 2 Der Zahlen ring f r die 4 Bit Zahlen im Zweierkomplement Die Be reichs berschreitung wird durch das berlaufsflag Overflow angezeigt 8 2 ADDITION UND SUBTRAKTION 69 Bitmuster Wert dezimal 01111101 125 01111110 126 01111111 127 10000000 128 10000001 127 10000010 126 10000011 125 Tabelle 8 3 Die Bruchstelle zwischen positiven an die negativen Zahlen beim berlauf am Bei spiel der 8 Bit Zahlen im Zweierkomplement Bsp Die Operation 127 1 f hrt zu dem falschen Ergebnis 128 der Fehler wird durch das berlaufsflag Overflow angezeigt Auch die Zweierkomplement Zahlen k nnen sehr sch n im Zahlenring dargestellt werden die Bereichs berschreitung wird hier durch das berlaufllag angezeigt Die Vorzeichenumkehr einer Zahl im Zweierkomplement wird bewirkt durch Invertieren aller Bits und anschlie endes Inkre mentieren Dies kann leicht gezeigt werden wenn man von G1 8 2 ausgeht Es ist Z das bitweise invertiertes Z und 1 a i 4 n 2 Z 1 4pn1 2 5
154. ser 70h IRQ8 Echtzeituhr HW 2 HW 75h IRQ13 Coprozessor HW 77h IRQ15 reserviert HW Die gr te Gruppe stellt hierin Int 21h der DOS Funktionsaufruf dar Das System der Interrupts hat f r den Programmierer mehrere Vorteile Man braucht sich bei Betriebssystem Aufrufen nicht um Adressen zu k mmern die Nummer gen gt Diese bleibt richtig auch wenn eine neue 5 2 AUSF HRUNG VON BETRIEBSSYSTEMAUFRUFEN IN ASSEMBLER 47 Betriebssystemversion installiert wird Andererseits k nnen Interruptvektoren ge ndert werden und z B auf eigene Routinen zeigen Damit es ist z B m glich auf Ereignisse in der Hardware mit eigenen Programmst cken zu reagieren Au erdem gibt es freie Interrupts d h dass der Satz von Betriebssystem Aufrufen durch eigene Routinen erweitert werden kann die dann in jeder beliebigen Programmiersprache leicht erreichbar sind 5 2 Ausf hrung von Betriebssystemaufrufen in Assembler Die Ausf hrung von Betriebssystemaufrufen in Assembler geschieht in drei Phasen 1 Vorbereitung A Die n here Spezifizierung des gew nschten Aufrufes durch Ablage der entsprechenden Funktionsnummern in Registern Dabei wird zumindest das Register AH belegt evtl au Berdem AL B Soweit notwendig die bergabe von Parametern Dies geschieht ebenfalls in Registern 2 Aufruf In jedem Falle der Befehl INT Nr Interrupt Die Nummer variiert entsprechend dem gew nschten Aufruf s Tabelle 3 Auswertung Der Betr
155. short AX int long EAX real double Numerikeinheit Register st 0 Strukturen bis zu 64 Bit EDX EAX Strukturen gr er als 64 Bit Zeiger auf Speicherbereiche Ein Beispiel soll einige Zugriffe in Inline Assembler in MSVC demonstrieren include lt stdio h gt Funktion in Inline Assembler int Produkt int Faktori int Faktor _asm d mov eax Faktor2 zweiter Parameter in eax imul eax Faktori ersten Parameter damit multiplizieren Ergebnis bleibt in eax zur R ckgabe return Hier wird ein Warning erzeugt da scheinbar der R ckgabewert fehlt main char char1 110 short short1 int int1 int2 int3 int pl p2 int pp int x 10 Zugriff auf Variable _asm mov al A _asm inc al _asm mov chari al short1 200 _asm sar word ptr short1 1 _asm mov int1 0OFFFFFFOOh printf chari c shorti i Spruenge _asm mov eax int1 cmp int2 eax je weiter cmp eax 10 jl Marke1 mov dword ptr int2 0 markel weiter Benutzung von Zeigern _asm lea ebx int2 _asm mov p1 ebx _asm mov dword ptr ebx 99 _asm mov p2 ebx printf int1 i n int2 Zeiger auf Zeiger int3 25 pil amp int3 pp amp p1 _asm mov ebx pp _asm mov ebx ebx _asm mov eax ebx _asm mov int1 eax KAPITEL 13 DIE SCHNITTSTELLE ZWISCHEN ASSEMBLER UND C C chari B 66 shorti 100 int 256d int1 i n chari shorti int1 inti lt gt in
156. sm CDi wechselt ins n chst h here Verzeichnis CDA wechselt ins oberste Verzeichnis Root Directory 122 KAPITEL 14 ASSEMBLERPRAXIS Dateien auflisten DIR Mit dem Befehl DIR Directory Verzeichnis listet man den Inhalt eines Verzeichnisses auf Dabei sind verschiedene Parameter erlaubt Beispiele dir Listet die Dateien im aktuellen Verzeichnis und Laufwerk dir a Listet die Dateien im aktuellen Verzeichnis von Laufwerk A dir asm Listet die Dateien im Verzeichnis asm Dateien kopieren COPY Mit dem Befehl COPY kann man Dateien kopieren Die Kopieen k nnen auf anderen Laufwerken in anderen Verzeichnissen oder in Dateien mit anderem Namen angelegt werden In dem Befehl folgt nach dem Wort COPY zun chst die Quelle der Daten dann das Ziel Beispiele copy aufl asmja Kopiert Datei auf1 asm auf Laufwerk A copy asmua Kopiert alle Datei mit Extension asm auf Laufwerk A copy a aufl asm c maschpr Kopiert Datei AUF1 ASM von A nach C MASCHPR copy a aufl asm Kopiert Datei AUF1 ASM von A ins aktuelle Verzeichnis von C 14 3 Assemblieren Linken Debuggen Um aus einem in Assembler geschriebenen Programm eine ausf hrbare Datei zu erzeugen mu man den Sourcefile Dateiname ASM assemblieren und linken Das geht z B mit dem Turbo Assembler von Borland mit der Kommandozeile TASM Dateiname ASM Der Assembler hat nun einen Object File Dateiname OBJ erzeugt Dieser wird mit dem Turbo Linker
157. sors auf dem Bildschirm gesteuert werden Einige Steuerzeichen sind unten wiedergegeben Dez Hex Kurzbez Bedeutung 7 07 BEL Klingelzeichen Piepen 8 08 BS Backspace Ein Zeichen nach links l schen 9 09 HT Horizontaler Tabulator 10 0A LF Line Feed Cursor eine Zeile tiefer stellen 11 0B VI Vertikaler Tabulator 12 0C FF Formfeed Neue Seite auf dem Drucker anfangen 13 0D CR Carriage Return Wagenr cklauf Cursor springt ganz nach links Tabelle 14 1 Einige Steuerzeichen Die darstellbaren Zeichen beginnen bei Nummer 32 20h Sie sind direkt zur Ausgabe auf dem Bildschirm gedacht Zur Erleichterung ist die Nummer der Zeichen dezimal und hexadezimal angegeben 118 14 1 DER ZEICHENSATZ Dez Hex Zeichen Dez Hex Zeichen Dez Hex Zeichen 32 20 64 40 a 96 60 i 33 21 65 41 A 97 61 a 34 22 E 66 42 B 98 62 b 35 23 67 43 C 99 63 b 36 24 68 44 D 100 64 d 37 25 69 45 E 101 65 e 38 26 amp 70 46 F 102 66 f 39 27 71 47 G 103 67 g 40 28 72 48 H 104 68 h 41 29 73 49 I 105 69 i 42 2A X 74 AA J 106 6A j 43 2B 75 4B K 107 6B k 44 2C 76 4C L 108 6C l 45 2D 77 4D M 109 6D m 46 3E E 78 4E N 110 6E n 47 3F 79 4F O 111 Ob o 48 30 0 80 50 P 112 70 p 49 31 1 81 51 Q 113 71 q 50 32 2 82 52 R 114 72 r 51 33 3 8
158. ster des intel 80386 Es sind nur die f r die Anwendungsprogrammierung interessanten Register dargestellt Die Allzweckregister k nnen relativ frei benutzt werden bei einigen Befehlen werden aller dings bestimmte Register bevorzugt So ist EAX das Hauptrechenregister A Accu das bei einigen Rechenbefehlen zwingend benutzt werden muss und bei anderen g nstig ist ECX ist das Z hlregister und wird bei Schleifen und Stringbefehlen zwingend als Z hler eingesetzt C Count EDX wird mit EAX zusammen benutzt um in EAX EDX 64 Bit Operanden auf zunehmen man hat dann also doppelte Bitzahl D Double EDI und ESI sind Register die bei den sog Stringbefehlen eine besondere Bedeutung als Zei gerregister haben ESI Extended Source Index ist der Zeiger auf den Speicherplatz der als Datenquelle dient EDI Extended Destination index ist das Ziel EBP und ESP dienen zur Adressierung des Stack eines besonderen Speicherbereiches der als Last in First out Speicher organisiert ist In ESP Extended Stack Pointer ist der Zeiger auf die aktuelle Spitze des Stack gespeichert d h das zuletzt auf den Stack gebrachte Wort Mit EBP wird der Stack frei adressiert Die Register CS DS SS ES FS und GS sind sogenannte Segmentregister Beim 8086 war der Speicher n mlich segmentiert und CS enthielt einen Zeiger auf das Codesegment Programm speicher DS einen Zeiger auf das Datensegment Datenspeicher und SS einen Zeiger auf das 16 KAPITEL 1 EINF
159. t Breite mit dem Speicher Befehl movq move quadword 63 0 Abbildung 12 1 Die MMX Einheit verf gt ber acht Register alle mit einer Breite von 64 Bit Man muss erw hnen dass die MMX Einheit nicht wirklich acht neue Register hat sondern dass diese Register die Mantissenanteile der Gleitkommaregister sind Dies ist wichtig f r die Programmierung Ein Schreibvorgang auf ein MMX Register zerst rt FPU daten und umge kehrt Man sollte daher MMX und FPU Befehle nicht mischen und muss nach Abschluss der MMX Operationen mit dem Befehl emms empty multimedia state die Register leer hinterlassen FPU Tag Worte alle gleich 11b Ausserdem werden drei neue Formate definiert die gepackte Ganzzahlen enthalten und mit 64 Bit Breite nat rlich genau in die MMX Register passen Zus tzlich kann die MMX Einheit auch eine ungepackte 64 Bit Ganzzahl in einem MMX Register ablegen An einem Beispiel soll nun eine typische SIMD Operation auf einer MMX Einheit gezeigt werden Der Befehl paddb Operand1 Operand2 behandelt die beiden Operanden als Einheit von acht gepackten Bytes f hrt acht paarweise Additionen aus und speichert die acht Ergebnisse im ersten Operanden ab Das Schema ist in Abb 12 2 gezeigt In dem folgenden Programmierbeispiel wird nur die untere H lfte der MMX Register ausgenutzt mov eax 010203F0h 12 2 REGISTER DATENFORMATE UND BEFEHLE 91 NETT eege 63 0 A Te 63 0 A Gebees 63 0 Abbildung 12 2 Die gepackten MMX For
160. t Speicherbenutzung Abschnitt 2 5 1 berlegen Sie ob die folgenden Befehle korrekt sind DATA Zaehleri DB Zaehler2 DB O Endechar DB Startchar DB Ai Pixelx DW Pixely DW 01FFh Schluessel DD 1200h CODE mov Zaehleri 100h mov Zaehler2 ax mov ah 2 mov dx Startchar int 21h movzx Endechar Q mov edx Startchar xchg Pixely cx mov schluessel ebp mov Pixelx Pixely 3 3 Konstante zu gross f r 8 Bit Variable Register hat 16 Bit Speichervariable hat 8 Bit funktioniert setzt allerdings unn tigerweise dh 0 movzx wird nicht gebraucht bei zwei 8 Bit Operanden 3 3 Statt mov muss movzx benutzt werden o k o k geht nicht da zwei Speicheroperanden in einem Befehl 2 Uberlegen Sie welche der folgenden Befehle zu Fehlermeldungen Warnungen oder Lauf zeitfehlern f hren 125 126 KAPITEL 15 L SUNGEN ZU DEN TESTFRAGEN DATA Nummer DB 25 DUP 0 zahl DW O CODE 386 mov Nummer cx al mit cx kann nicht adressiert werden mov Nummer ecx al o k da beliebige 32 Bit Register erlaubt mov al Nummer bl mit 8 Bit Registern kann nicht adressiert werden mov bx bp 10 0 nicht erlaubt zwei Basisregister mov si di 1 10h nicht erlaubt zwei Indexregister mov bx offset zahl mov cl Nummer bx Laufzeitfehler Adresse liegt hinter dem Feld Nummer mov cl Nummer o k bertr gt das erste Byte von Nummer inc bx 3 Speicher 66 11 07 22 08 33 0
161. t2 Sprung zu C Sprungmarke Sprung zu Assembler Sprungmarke p1 erh lt die Adresse von int2 p1 int2 99 p2 enth lt die gleiche Adresse wie pl p2 p1 pi enzh lt die Adresse von int3 pp enth lt Adresse von pl Inhalt von Zeiger pp Adresse von p1 nach ebx Inhalt von Zeiger p1 Adresse von int3 nach ebx Zugriff auf int3 Kopie auf inti printf int1 i int3 i n int1 int3 13 6 EINBINDUNG VON ASSEMBLERCODE IN C C PROGRAMME 111 Zugriff auf Felder hier Initialisierung eines Feldes mit OxFFFFFF _asm d mov ecx 10 mov eax OFFFFFFh 11 mov dword ptr x ecx 4 4 ecx loop 11 for int1 0 int1 lt 10 int1 printf 3i x int1 Aufruf der Inline Assembler Funktion int1 33 int2 100 int3 Produkt int1 int2 printf 10i n int3 return 0 Programmausgabe char1 B short1 100 int1 256 int1 99 int1 25 int3 25 1 2 3 4 5 6 7 8 910 3300 13 6 2 Inline Assembler in Borland C Programmen 16 Bit Hier sind beispielhaft die Verh ltnisse f r den 16 Bit C Compiler von Borland angegeben Das Format einer Inline Assembleranweisung ist asm Assemblerbefehl F r mehrere aufeinanderfolgende Befehle kann auch wie folgt verfahren werden asm Assemblerbefehl Assemblerbefehl Assemblerbefehl La Dabei gelten f r die Assemblerbefehle folgende Regeln 1 Die Operanden der Befehle d rfen auch Konstanten Variablen und Labels Sprungmarken des umgebenden C
162. tion des Befehls im Beispiel Beschreibung Operand2 wird von Operand1 subtrahiert die Flags werden wie bei SUB gesetzt aber das Ergebnis wird weggeworfen Die Auswertung der gesetzten Flags erfolgt meist durch einen direkt nachfolgenden bedingten Sprungbefehl CMP arbeitet f r vorzeichenbe haftete und vorzeichenlose Zahlen korrekt Es k nnen nicht beide Ope randen Speicheroperanden sein Siehe auch SUB Durch das Pfeilsymbol Verweis wird auf einen in diesem Zusammenhang interessanten Befehl verwiesen der ebenfalls in dieser Kurzreferenz beschrieben ist Abschlie end werden zu dem Befehl ein oder mehrere kurze Beispiele gegeben Beispiele Abbruch einer Z hlschleife mit CMP MOV CX 0 CX 0 Li CALL Unterprog Schleifenrumpf INC CX CMP CX 10 CX 10 JNE L1 Wenn nicht Schleife fortsetzen Die Zeile trennt Beispiele voneinander Wird in der Beschreibung des Befehls auf Bits Bezug genommen so ist zu beachten da das niederwertigste Bit die Nr 0 hat 16 1 1 Das Format einer Assembler Zeile Das Format einer Assemblerzeile ist Label Befehl Anweisung Operanden Kommentar Ebenfalls erlaubt sind reine Kommentarzeilen Zeilen die mit beginnen sowie Leerzeilen 16 2 Transportbefehle MOV Move Bewegen Syntax MOV Ziel Quelle Ziel reg8 16 32 mem8 16 32 Quelle reg8 16 32 mem8 16 32 Direktoperand 16 2 TRANSPORTBEFEHLE 133 Flags Beschreibung Allgemeiner und
163. turn 16 12 Prozessorkontrollbefehle Clear Set Directionflag LDISTD C 3 L schen Setzen Richtungsflag Syntax CLD STD Flags D Beschreibung Diese Befehle dienen zur direkten Manipulation des Directionflags Rich tungsflag und werden benutzt um Stringoperationen vorzubereiten e CLD l scht das Directionflag DF 0 Autoinkrement bei Strin goperationen e STD setzt das Directionflag DF 1 Autodekrement bei String operationen Beispiele s REP Clear Set Interruptflag LISTI C IS L schen Setzen Unterbrechungsflag Syntax CLI STI Flags 16 12 PROZESSORKONTROLLBEFEHLE 155 Beschreibung Diese Befehle dienen zur direkten Manipulation des Interruptflags Un terbrechungsflag Bei gesetztem Interruptflag sind externe Interrupts zugelassen sonst nur NMI e CLI l scht das Interruptflag IF 0 e STI setzt das Interruptflag IF 1 Beispiele Interruptvektor Timerinterrupt neu setzen CLI Interrupts w hrend Manipulation an Interrupt Vektoren Tabelle sperren Besser DOS Funktion 25h benutzen MOV 32 DX MOV AX CS MOV 34 AX STI Interrupts wieder zulassen Clear Set Complement Carry CLC STCICMC L schen Setzen Komplementieren des Carryflags Syntax CLC sTC CMC Flags C Beschreibung Diese Befehle dienen zur direkten Manipulation des Carryflags e CLC l scht das Carryflag CF 0 e STC setzt das Carryflag CF 1 e CMC komplementiert
164. turn aminusb 13 ret 8 idifferenz200YGHHH Z ENDP idifferenz3 YIHHH Z PROC NEAR lokale Variable aminusb nicht angelegt dadurch bleibt esp unver ndert Stackframe eingespart Adressierung mit ESP da dies hier m glich ist ESP unver ndert idifferenz1 idifferenz2 COMDAT hnlich idifferenz1 idifferenz2 idifferenz3 COMDAT EE int _fastcall idifferenz3 int a int b mov eax ecx Register bergabe kein Stackframe keine lokale Variable 16 int aminusb 17 aminusb a b sub eax edx 18 return aminusb 19 A ret 0 idifferenz3 00YIHHH Z ENDP _main PROC NEAR 22 int i j K 23 24 i 100 25 si 26 5 27 ksidifferenz1 i j push 1 push 100 call idifferenz1 YAHHHO Z add esp 8 idifferenz3 COMDAT 00000064H idifferenz1 13 6 EINBINDUNG VON ASSEMBLERCODE IN C C PROGRAMME 105 28 29 ksidifferenz2 i j push 1 push 100 00000064H call idifferenz20CYGHHHCZ idifferenz2 30 z 31 ksidifferenz3 i j mov edx 1 mov ecx 100 00000064H call idifferenz30 CYIHHHCZ idifferenz3 5 32 33 return 0 xor eax eax 34 35 3 ret 0 _main ENDP END 13 6 Einbindung von Assemblercode in C C Programme 13 6 1 Inline Assembler in Microsoft Visual C C Programmen 32 Bit In C C Programmen die mit Microsofts Visual C Compiler bersetzt werden kann Inline Assemb
165. tzt werden durch mov ebx 2800h Zeilen 5 6 Diese beiden Befehle k nnen ersetzt werden durch movzx eax dl Zeile 7 Entspricht No Operation NOP ndert kein Register u kein Flag Zeilen 8 10 Soll eine Vertauschung von DI und SI bewirken besser xchg di si 6 movzx mov mov mov mov DX BX BX AX AX CX CX DX xchg ax bx xchg ax cx ai mov shr mov b mov shl mov c mov mov si ax eax 16 di ax ax dx eax 16 ax cx dl cl dh ch Inhalt von BX parken retten geht nur wenn DX frei oder besser und k rzer mov eax ax dx cx L sungen der Fragen zu den Betriebssystemaufrufen Abschnitt 5 4 128 KAPITEL 15 L SUNGEN ZU DEN TESTFRAGEN Abschnitt 1 Nummer des Funktionsaufrufes wurde nicht in AH hinterlegt Abschnitt 2 int 21 dezimal statt 21h wird aufgerufen Achtung t ckischer Fehler Abschnitt 3 Aufruf korrekt aber sinnlos Die Ergebnisse in DX und CX werden berschrieben Abschnitt 4 Aufruf korrekt f hrt aber zur unbeabsichtigten Ausgabe von Zeichen da die Zei chenkette nicht mit Zeichen begrenzt ist Abschnitt 5 Vorbereitung korrekt aber Betriebssystemaufruf hier Int 21h fehlt L sungen der Testfragen zu den Bitbefehlen Abschnitt 6 4 1 AX 1214h BX 5335h CX FFFFh DX ED10h 2 al 54h bl CAh cl 56h dl 55h 3 and ax 1111111111011110b oder and ax OFFDEh or ax 0000000000001010b oder or ax OAh xor ax 0000000010000100b oder xor ax 84h 4 mov si
166. ump sein F r die Bedingung XXX gibt es zahlreiche M glichkeiten die in der nach folgenden Tabelle aufgef hrt sind Bsp XXX NGE ergibt den Befehl JNGE d h Jump if not greater or equal Viele bedingte Sprungbefehle sind unter mehreren Mnemonics verf gbar z B ist JNGE identisch mit JL Jump if less Durch entsprechende Interpretation der Flags wird zwi schen Arithmetik mit und ohne Vorzeichen unterschieden Die arithme tischen bedingten Sprungbefehle werden typischerweise nach einem CMP angeordnet In diesem Fall ist das Sprungverhalten genau so wie die Namen vermuten lassen CMP AX BX Vgl AX und BX JG Label1 Sprung wenn AX gt BX wird bersprungen Label MOV AX OFFh 146 KAPITEL 16 ASSEMBLERBEFEHLE NACH GRUPPEN Bedingte Springe Befehl Sprungbedingung Sprungbed dt Flags Direkte Abfrage von Flags JE JZ equallzero gleich Null ZF 1 JNE JNZ not equal zero ungleichlungleich Null ZF 0 JS signed Vorzeichen negativ SF 1 JNS not signed Vorzeichen positiv SF 0 JP JPE parity parity even gerade Parit t PF 1 JNP JPO no parity parity odd ungerade Parit t PF 0 JO overflow berlauf OF 1 JNO no overflow kein berlauf OF 0 JC carry bertrag CF 1 JNC no carry kein bertrag CF 0 Arithmetik mit Vorzeichen JL JNGE less not greater or equal kleiner CF 4 OF JLEJJNG less or equallnot greater kleiner oder gleich SF 4 OF oder ZF 1 JNL JGE not less greater or equal nicht klein
167. ungen bei der Vorbesetzung wobei die Anzahl der aufgez hlten Elemente gleichzeitig die Feldgr e festlegt Dies ist speziell bei Texten n tzlich Die Syntax f r die Definition einer Feldvariablen mit DUP ist Variablenname Define Direktive Anzahl Feldelemente DUP Vorbesetzungswert Beispiele Meldung DB 80 DUP Feld aus 80 Bytes keine Vorbelegung Quadratel DD 100 DUP O Feld aus 100 Doppelworten Vorbelegung mit 0 Bei der Felddefinition durch Aufz hlung bei der Vorbesetzung entf llt die Angabe DUP Beipiele Meldungi DB Divisionsfehler Vorbesetzung mit einer Zeichenkette das Feld erh lt 16 Byte Speicherplatz Meldungi DB Hallo Welt 13 10 Vorbesetzung mit einer Zeichenkette und Steuerzeichen 12 Byte Speicherplatz Quadrate2 DD 1 4 9 16 25 36 DD 49 64 81 100 initialisiertes Doppelwortfeld mit Zeilenumbruch 24 KAPITEL 2 ORGANISATION UND BENUTZUNG DES HAUPTSPEICHERS Wichtig Bei Feldern repr sentiert der Name des Feldes die Adresse des ersten Speicherplatzes Um darauffolgende Speicherpl tze anzusprechen benutzt man die indirekte Adressierung Die Daten liegen im Datensegment in der Reihenfolge ihrer Definition Der Speicher ist auch heute noch in Bytes organisiert Bei der Speicherung von Texten gibt es daher keine Probleme denn die Textzeichen sind ja 8 Bit Gr en Anders ist das bei Zahlen Zahlen die mit mehr als 8 Bit dargestellt sind m ssen mehrere Speicherzellen Bytes belegen da
168. unktionswert zur ckgibt mu sie das in der gleichen Art tun wie eine C Funktion Dies erfolgt ber Register wie in der folgenden Tabelle aufgef hrt ist 116 KAPITEL 13 DIE SCHNITTSTELLE ZWISCHEN ASSEMBLER UND C C Datentyp in C Register unsigned char AX char AX enum AX unsigned short AX short AX unsigned int AX int AX unsigned long DX AX long DX AX float 8087 ST 0 double 8087 ST O long double 8087 ST O near AX far DX AX Die bergabe von Parametern In C C erfolgt die bergabe von Parametern bei Funktionsaufrufen ber den Stack Vor dem Aufruf werden die Parameter mit PUSH auf dem Stack abgelegt wobei der letztgenann te Parameter zuerst abgelegt wird Beim Aufruf der Funktion wird im n chsten Schritt die R cksprungadresse auf dem Stack abgelegt Bei Speichermodellen mit max 64 kB Code ist dies IP bei Speichermodellen mit mehr Code ist es CS IP Um den Stack zu adressieren wird BP be nutzt Da die rufende Funktion ein nach Ausf hrung der aufgerufenen Funktion unver ndertes BP erwartet mu der aktuelle Wert von BP selbst auf den Stack gerettet werden der erste Befehl im Unterprogramm ist also PUSH BP Danach wird BP zur Adressierung des Stack vorbereitet was mit MOV BP SP geschieht Durch Vermindern von SP kann nun Platz f r lokale Variable reserviert werden Nun werden die eigentlichen Befehle des Unterprogramms ausgef hrt wobei man Parameter wie auch lokale Variable
169. x mov ecx DWORD PTR _i ebp push ecx call 7idifferenz100YAHHHOZ idifferenzi add esp 8 mov DWORD PTR _k ebp eax 29 ksidifferenz2 i j mov edx DWORD PTR _j ebp push edx mov eax DWORD PTR _i ebp push eax call idifferenz20CYGHHHCZ idifferenz2 mov DWORD PTR _k ebp eax 30 31 ksidifferenz3 i j mov edx DWORD PTR _j ebp mov ecx DWORD PTR _i ebp call idifferenz30 CYIHHHCZ idifferenz3 mov DWORD PTR _k ebp eax 5 32 S 33 return 0 xor eax eax 34 35 mov esp ebp pop ebp ret 0 main ENDP END 13 5 2 Optimierungen In dem folgenden Beispiel wird die bersetzung des gleichen Programms optimiert auf hohe Ausf hrungsgeschwindigkeit Der Compiler versucht dann berfl ssige Befehle wegzulassen die z B in obigem Beispiel bei der Register bergabe offensichtlich sind Der gleiche Code nach optimierter ber set zung Option 02 Segmentdirektiven weggelassen _a 8 _b 12 idifferenz1i 0CYAHHHCZ PROC NEAR idifferenz1 COMDAT 104 KAPITEL 13 DIE SCHNITTSTELLE ZWISCHEN ASSEMBLER UND C C 4 int aminusb 55 aminusb a b mov eax DWORD PTR _a l esp 4 mov ecx DWORD PTR _b esp 4 sub eax ecx 56 return aminusb 57 Gs ret 0 Tidifferenz1i00YAHHHOZ ENDP _a 8 _b 12 idifferenz20 CYGHHHCZ PROC NEAR 10 int aminusb 5 11 aminusb a b mov eax DWORD PTR _a l esp 4 mov ecx DWORD PTR _b esp 4 sub eax ecx 12 re
Download Pdf Manuals
Related Search
Related Contents
小学3・4年生 1975夏~2014冬(PDFファイル 575KB) manuale di utilizzo e manutenzione brushless blender n°62 Plug-in - Sandokan 30-100 Manual - RIKON Power Tools Spectre Circuit Simulator User Guide Owner`s Manual CMT-EP40 installation and user instructions electric pizza ovens CubeSuite Ver.1.40 Integrated Development Environment User`s Copyright © All rights reserved.
Failed to retrieve file