lehrerbibliothek.deDatenschutzerklärung
Assembler Die Profireferenz
Assembler
Die Profireferenz




Oliver Müller

Reihe: Referenz Professional Series


Franzis' Verlag GmbH
EAN: 9783772375071 (ISBN: 3-7723-7507-3)
639 Seiten, kartoniert, 18 x 25cm, September, 2002, inklusive CD-ROM

EUR 39,95
alle Angaben ohne Gewähr

Umschlagtext
Das Handbuch mit dem doppelten Nutzen in einer neuen Auflage: Kompetent werden Sie in die Assembler-Programmierung eingeführt und haben gleichzeitig eine umfassende Praxis-Referenz zum Nachschlagen an der Hand.



Dieses Buch zeigt Ihnen, wie Sie unter Windows 3.x, Windows 95/98, DOS und Linux mit Assembler programmieren und was Sie über Aufbau und Funktionsweise der CPU und verschiedener Prozessormodi wissen mussen, die Prozessoren Pentium II, Pentium III und AMD miteingeschlossen.



Aktualität, Aufbau, Vollständigkeit und ein umfangreiches Stichwortverzeichnis machen diese Referenz fur erfahrene Programmierer zu einem unentbehrlichen Begleiter bei der täglichen Arbeit.





Aus dem Inhalt



• Assembler und die Architektur der 80x86-Prozessoren

• Objektorientierte Programmierung mit TASM

• Mathematischer Koprozessor

• FPU-Programmierung

• Einbinden von Assembler in die Hochsprache C/C++ und Pascal/Delphi

• Funktionsvergleich der Assembler-Anweisungen MASM und TASM

• Mit Linux-Teil





Auf CD-ROM



• Assembler (Open Source) fur DOS, Windows, Linux

• Dokumentationen

• FreeDOS
Inhaltsverzeichnis
1 Einleitung 25

1.1 Zielsetzung und Motivation des Buches 25

1.2 Aufbau des Buches 25
1.2.1 Der erste Teil 26
1.2.2 Der zweite Teil 26


2 Assembler und die Architektur der 80x86-Prozessoren 27

2.1 Die Generationen der Programmiersprachen 27

2.2 Assembler im Blickpunkt 28

2.3 Die Intel 80x86-Prozessorfamilie 29
2.3.1 Aufbau eines Mikroprozessors 30
2.3.2 Der 8086-Prozessor 30
2.3.3 Die Register 32

2.4 Adressbildung mittels Segment und Offset 38

2.5 Prozessormodi und Speichermodelle 40
2.5.1 Der Real-Mode 41
2.5.2 Der Protected-Mode 51
2.5.3 Der V86-Mode 57
2.5.4 Interrupts im Protected-Mode 58

2.6 Übersetzen von Assemblerprogrammen 59
2.6.1 DOS 60
2.6.2 Windows 3.1x 61
2.6.3 Windows 9x und NT 63
2.6.4 Linux 63


3 Basiswissen 65

3.1 Das erste Assembler-Programm 65
3.1.1 Ein Exkurs zum Ideal-Modus von TASM 68

3.2 Die direkte Segmentierung 68

3.3 Verzweigungen, Sprünge und Schleifen 71
3.3.1 Verzweigungen und Sprünge 71
3.3.2 Schleifen 76

3.4 Unterprogramme 82
3.4.1 Parameterübergabe per Register 83
3.4.2 Parameterübergabe durch globale Variablen 86
3.4.3 Parameterübergabe per Stapel 89
3.4.4 Externe Unterprogramme 95
3.4.5 Lokale Variablen in Unterprogrammen 99

3.5 Makros 99
3.5.1 Die Grenzen der Makros 101
3.5.2 Makrobibliotheken 102

3.6 Adressierung 102
3.6.1 Direkte Adressierung 103
3.6.2 Indirekte Adressierung 107

3.7 Verarbeitung von Strings 110

3.8 Abschluss des Assembler-ABC 118
3.8.1 Variablen 118
3.8.2 Komplexe Datenstrukturen 119
3.8.3 Konstanten 124
3.8.4 Fortsetzen von Zeilen 125
3.8.5 Operatoren 125
3.8.6 Bedingte Assemblierung 126


4 Programmierung unter DOS 129

4.1 Textein- und -ausgabe 129
4.1.1 Der DOS-übliche Rahmen 129
4.1.2 Verarbeitung von ASCIIZ-Strings 133

4.2 Arbeiten mit Dateien und Verzeichnissen 137

4.3 Programme starten 147
4.3.1 Speicherplatz freigeben 152
4.3.2 Programm starten 155

4.4 Die Kommandozeile 157

4.5 Speicherresidente Programme (TSR) 159
4.5.1 Eine einfache Interrupt-Routine 160
4.5.2 Die Interrupt-Handler-Kette 165


5 Assembler unter Windows 3.1x 171

5.1 Grundlagen der Windows-Programmierung 171
5.1.1 DOS- versus Windows-Programmierung 171
5.1.2 Basiswissen zu Windows 172

5.2 16-Bit-Programme für Windows in Assembler 175
5.2.1 Der Startup-Code 175
5.2.2 Eine Beispielapplikation 180


6 Assembler unter Windows 9x und NT 197

6.1 16-Bit-Windows versus 32-Bit-Windows 197

6.2 Eine Win32-Applikation in Assembler 198
6.2.1 Prototypen, Datentypen und Datensegment 199
6.2.2 Die Initialisierung 202
6.2.3 Die Message-Loop 205
6.2.4 Die Callback-Funktion 206


7 Objektorientiertes Programmieren mit TASM 211

7.1 Grundlagen der Objektorientierten Programmierung 211
7.1.1 Klasse und Objekt 211
7.1.2 Vererbung 212
7.1.3 Parametrisierte Klassen 214
7.1.4 Nachrichten 214
7.1.5 Polymorphismus 215

7.2 OO-Unterstützung von TASM 215
7.2.1 Lokale Symbole 216
7.2.2 Organisation eines OO-Quelltextes 217
7.2.3 Eine einfache String-Klasse 217
7.2.4 Vererbung und virtuelle Methoden 231


8 Der mathematische Koprozessor 237

8.1 Der Aufbau der FPU 238
8.1.1 Die Architektur der FPU 238
8.1.2 Die unterstützten Zahlenformate 240

8.2 Eine Beispielapplikation 242
8.2.1 Das Hauptprogramm 243
8.2.2 Numerischen Wert in String konvertieren - genstr 246


9 Einbinden in Hochsprachen 249

9.1 Grundlagen 249

9.2 DOS und 16-Bit-Windows 250
9.2.1 C und C++ 251
9.2.2 Pascal und Delphi 1.x 253

9.3 32-Bit-Windows 255
9.3.1 C und C++ 255
9.3.2 Delphi für Win32 256


10 Assembler unter Linux 259

10.1 Warum Assembler unter Linux? 259

10.2 Basiswissen 261
10.2.1 AT&T-Syntax 261
10.2.2 Die Assembler 262
10.2.3 Einsatzmöglichkeiten 263

10.3 Assembler einbinden in C 263

10.4 Direkte Linux-Systemaufrufe 264


11 Literatur 267


Stichwortverzeichnis 269



Referenz-Teil 277


1 Die Prozessorbefehle 279

1.1 Die Mnemonics 279

1.2 Erläuterungen zur Befehlsreferenz 282
1.2.1 Syntax 282
1.2.2 Beschreibung 282
1.2.3 Flags 282
1.2.4 Taktzyklen 283
1.2.5 Die Spalten 284

1.3 Befehlsreferenz 286
1.3.1 AM - Korrektur nach einer ASCII-Addition 286
1.3.2 AAD - Korrektur vor einer ASCII-Division 287
1.3.3 AAM - Korrektur nach einer ASCII-Multiplikation 288
1.3.4 AAS - Korrektur nach einer ASCII-Subtraktion 288
1.3.5 ADC - Addieren mit Übertrag 289
1.3.6 ADD - Addieren 290
1.3.7 AND - logisches UND 291
1.3.8 ARPL - Korrektur des Adjust-RPL-Felds im Selector 292
1.3.9 Bound - Bereichsgrenzen prüfen 293
1.3.10 BSF - Bitsuche vorwärts 293
1.3.11 BSR - Bitsuche rückwärts 294
1.3.12 BSWAP - Byte-Reihenfolge vertauschen 295
1.3.13 BT - Bit-Prüfung 295
1.3.14 BTC - Bit-Prüfung und Komplementbildung 296
1.3.15 BTR - Bit-Prüfung und Reset 297
1.3.16 BIS - Bit prüfen und setzen 298
1.3.17 CALL - Unterprogramm aufrufen 298
1.3.18 CBW - Umwandlung von Byte in Word 301
1.3.19 CDQ - Umwandlung von Double-Word in Quad-Word 302
1.3.20 CLC - Carry-Flag löschen 302
1.3.21 CLD - Direction-Flag löschen 303
1.3.22 CLI - Interrupt-Flag löschen 303
1.3.23 CLTS - Task-Switched-Flag löschen 304
1.3.24 CMC - Komplement des Carry-Flags 305
1.3.25 CMP - Vergleich zweier Werte 306
1.3.26 CMPS/CMPSB/CMPSW/CMPSD - String-Vergleich 307
1.3.27 CMPXCHG - Vergleichen und austauschen 308
1.3.28 CMPXCHG8B - 8 Bytes vergleichen und austauschen 308
1.3.29 CPUID - CPU identifizieren 309
1.3.30 CWD - Umwandlung von Word in Double-Word 310
1.3.31 CWDE - Umwandlung von Word in Double-Word 311
1.3.32 DAA - Dezimalkorrektur von AL nach Addition 311
1.3.33 DAS - Dezimal-Korrektur von AL nach Subtraktion 312
1.3.34 DEC - Dekrementieren um 1 312
1.3.35 DIV - Division ohne Vorzeichenberücksichtigung 313
1.3.36 ENTER - Stack-Frame für Prozedurparameteranlegen 314
1.3.37 HLT - Halt 315
1.3.38 IDIV - Vorzeichenbehaftete Division 315
1.3.39 IMUL - Vorzeichenbehaftete Multiplikation 316
1.3.40 IN - Port lesen 318
1.3.41 INC - Inkrementieren um 1 319
1.3.42 INS/INSB/INSW/INSD - Daten aus Port in String einlesen 320
1.3.43 INT - Software-Interrupt auslösen 322
1.3.44 INTO - Interrupt 4 bei Arithmetik-Überlauf auslösen 323
1.3.45 INVD - Inhalt des Cache für ungültig erklären 324
1.3.46 INVLPG - TLB-Eintrag als ungültig markieren 325
1.3.47 IRET/IRETD/IRETW - Rücksprung aus Interrupt-Handler 326
1.3.48 JA - Sprung, wenn vorzeichenlos größer 327
1.3.49 JAE - Sprung, wenn vorzeichenlos größer oder gleich 328
1.3.50 JB - Sprung, wenn vorzeichenlos kleiner 329
1.3.51 JBE - Sprung, wenn vorzeichenlos kleiner oder gleich 330
1.3.52 JC - Sprung, wenn Carry-Flag gesetzt 330
1.3.53 JCXZ - Sprung, wenn CX gleich Null 331
1.3.54 JE - Sprung, wenn gleich 332
1.3.55 JECXZ - Sprung, wenn ECX gleich Null 332
1.3.56 JG - Sprung, wenn vorzeichenrichtig größer 333
1.3.57 JGE - Sprung, wenn vorzeichenrichtig größer oder gleich 334
1.3.58 JL - Sprung, wenn vorzeichenrichtig kleiner 334
1.3.59 JLE - Sprung, wenn vorzeichenrichtig kleiner oder gleich 335
1.3.60 JMP - Sprung 336
1.3.61 JNA - Sprung, wenn vorzeichenlos nicht größer 338
1.3.62 JNAE - Sprung, wenn vorzeichenlos nicht größer/gleich 339
1.3.63 JNB - Sprung, wenn vorzeichenlos nicht kleiner 340
1.3.64 JNBE - Sprung, wenn vorzeichenlos nicht kleiner/gleich 340
1.3.65 JNC - Sprung, wenn Carry-Flag nicht gesetzt 341
1.3.66 JNE - Sprung, wenn nicht gleich 342
1.3.67 JNG - Sprung, wenn vorzeichenrichtig nicht größer 343
1.3.68 JNGE - Sprung, wenn vorzeichenrichtig nicht größer/gleich 343
1.3.69 JNL - Sprung, wenn vorzeichenrichtig nicht kleiner 344
1.3.70 JNLE - Sprung, wenn vorzeichenlos nicht kleiner/gleich 345
1.3.71 JNO - Sprung, wenn Overflow-Flag nicht gesetzt 345
1.3.72 JNP - Sprung, wenn Parity-Flag nicht gesetzt 346
1.3.73 JNS - Sprung, wenn Sign-Flag nicht gesetzt 347
1.3.74 JNZ - Sprung, wenn Zero-Flag nicht gesetzt 348
1.3.75 JO - Sprung, wenn Overflow-Flag gesetzt 348
1.3.76 JP - Sprung, wenn Parity-Flag gesetzt 349
1.3.77 JPE - Sprung, wenn Parität gerade ist 350
1.3.78 JPO - Sprung, wenn Parität ungerade 350
1.3.79 JS - Sprung, wenn Sign-Flag gesetzt 351
1.3.80 JZ - Sprung, wenn Zero-Flag gesetzt 352
1.3.81 LAHF - Flags in AH laden 353
1.3.82 LAR - Zugriffsrechte laden 353
1.3.83 LOS - Zeiger nach DS und Register laden 354
1.3.84 LEA - Effektiven Adressen-Offset laden 355
1.3.85 LEAVE - Verlassen einer Hochsprachenprozedur 356
1.3.86 LES - Zeiger nach ES und Register laden 357
1.3.87 LFS - Zeiger nach FS und Register laden 357
1.3.88 LGDT - Global-Descriptor-Table-Register laden 358
1.3.89 LGS - Zeiger nach GS und Register laden 359
1.3.90 LIDT - Interrupt-Descriptor-Table-Register laden 359
1.3.91 LLDT - Local-Descriptor-Table-Register laden 360
1.3.92 LMSW - Maschine-Status-Word laden 361
1.3.93 LOCK - Bus per LOCK#-Signal sperren 362
1.3.94 LODS/LODSB/LODSW/LODSD - Stringelement laden 363
1.3.95 LOOP - Schleifendurchlauf 364
1.3.96 LOOPE - Schleifendurchlauf, solange gleich 365
1.3.97 LOOPNE - Schleifendurchlauf, solange nicht gleich 365
1.3.98 LOOPNZ - Schleifendurchlauf, wenn ZF nicht gesetzt 366
1.3.99 LOOPZ - Schleifendurchlauf, wenn ZF gesetzt 367
1.3.100 LSL - Segmentgrenze laden 368
1.3.101 LSS - Zeiger nach SS und Register laden 369
1.3.102 LTR - Task-Register laden 369
1.3.103 MOV - Daten kopieren 370
1.3.104 MOVS/MOVSB/MOVSW/MOVSD - String kopieren 372
1.3.105 MOVSX - Kopieren unter Vorzeichenerweiterung 373
1.3.106 MOVZX - Kopie unter Erweiterung mit Null 373
1.3.107 MDL - Vorzeichenlose Multiplikation 374
1.3.108 NEG - Negation durch Zweier-Komplement 375
1.3.109 NOP - Keine Operation 376
1.3.110 NOT - Negation durch Einer-Komplement 376
1.3.111 OR - Inklusiv-Oder-Verknüpfung 377
1.3.112 OUT - Ausgabe auf Port 378
1.3.113 OUTS/OUTSB/OUTSW/OUTSD - Stringausgabe auf Port 379
1.3.114 POP - Wert vom Stapel nehmen 380
1.3.115 POPA/POPAD/POPAW - Allzweckregister vom Stapel 381
1.3.116 POPF/POPFD/POPFW - Flags vom Stapel laden 382
1.3.117 PUSH - Wert auf Stapel legen 383
1.3.118 PUSHA/PUSHAD/PUSHAW - Allzweckregister auf Stapel 384
1.3.119 PUSHF/PUSHFD/PUSHFW - Flags auf Stapel legen 385
1.3.120 RCL - Linksrotation durch Carry-Flag 386
1.3.121 RCR - Rechtsrotation durch Carry-Flag 387
1.3.122 RDMSR - Modellspezifisches Register auslesen 388
1.3.123 RDTSC - Time-Stamp-Counter auslesen 389
1.3.124 REP - Wiederholung von String-Operation 390
1.3.125 REPE - Wiederholung von String-Operation (ZF=1) 391
1.3.126 REPNE - Wiederholung von String-Operation (ZF=0) 392
1.3.127 RET - Rücksprung aus Unterprogramm 393
1.3.128 ROL - Linksrotation 394
1.3.129 ROR - Rechtsrotation 395
1.3.130 RSM - Fortfahren nach SMM-Interrupt 396
1.3.131 SAHF - AH in Flag-Register übertragen 397
1.3.132 SAL - Arithmetisch nach links schieben 398
1.3.133 SAR - Arithmetisch nach rechts schieben 399
1.3.134 SBB - Integer-Subtraktion mit Borgen 400
1.3.135 SCAS/SCASB/SCASW/SCASD - Strings vergleichen 401
1.3.136 SETcc - Byte entsprechend der Bedingung setzen 402
1.3.137 SGDT - Global-Descriptor-Table-Register speichern 403
1.3.138 SHL - logisch nach links schieben 404
1.3.139 SHLD - links schieben mit doppelter Genauigkeit 404
1.3.140 SHR - logisch nach rechts schieben 405
1.3.141 SHRD - rechts schieben mit doppelter Genauigkeit 406
1.3.142 SIDT - Interrupt-Descriptor-Table-Register speichern 407
1.3.143 SLDT - Local-Descriptor-Table-Register speichern 408
1.3.144 SMSW - Status-Word der CPU speichern 409
1.3.145 STC - Carry-Flag setzen 409
1.3.146 STD - Direction-Flag setzen 410
1.3.147 STI - Interrupt-Flag setzen 410
1.3.148 STOS/STOSB/STOSW/STOSD - Stringdaten speichern 411
1.3.149 STR - Task-Register speichern 412
1.3.150 SUB - Integer-Subtraktion 413
1.3.151 Test- logischer Vergleich 414
1.3.152 VERR/VERW - ermitteln ob Segment schreibbar/lesbar 414
1.3.153 WAIT - warten bis FPU BUSY-Leitung inaktiviert 415
1.3.154 WBINVD - Cache schreiben und für ungültig erklären 416
1.3.155 WRMSR - in modellspezifisches Register schreiben 416
1.3.156 XADD - austauschen und addieren 417
1.3.157 XCHG - Operandeninhalte austauschen 418
1.3.158 XLAT/XLATB - Tabelleneintrag ermitteln 419
1.3.159 XOR - logisches Exklusiv-Oder 420


2 Die FPU-Befehle 421

2.1 Die Mnemonics 421

2.2 Erläuterungen zur Befehlsreferenz 422
2.2.1 Syntax 422
2.2.2 Beschreibung 422
2.2.3 Exceptions 423
2.2.4 Taktzyklen 423

2.3 Befehlsreferenz 424
2.3.1 F2XM1 - 2^x-1 berechnen 424
2.3.2 FABS - absoluter Wert 425
2.3.3 FADD - Addition 425
2.3.4 FADDP - Addition und POP-Operation 426
2.3.5 FBLD - BCD laden 427
2.3.6 FBSTP - BCD speichern und POP-Operation 428
2.3.7 FCHS - Vorzeichen wechseln 428
2.3.8 FCLEX/FNCLEX - Exception aufheben 429
2.3.9 FCOM - Vergleich 429
2.3.10 FCOMP - Vergleich und POP-Operation 430
2.3.11 FCOMPP - Vergleich und zweifache POP-Operation 431
2.3.12 FCOS - Kosinus 432
2.3.13 FDECSTP - Stapelzeiger dekrementieren 432
2.3.14 FDISI/FNDISI - Interrupts abschalten 433
2.3.15 FDIV - Division 434
2.3.16 FDIVP - Division und POP-Operation 434
2.3.17 FDIVR - reziproke Division 435
2.3.18 FDIVRP - reziproke Division und POP-Operation 436
2.3.19 FENI/FNENI - Interrupts zulassen 437
2.3.20 FFREE - Register freigeben 437
2.3.21 FIADD - Integer-Addition 438
2.3.22 FICOM - Integer-Vergleich 439
2.3.23 FICOMP - Integer-Vergleich und POP-Operation 439
2.3.24 FIDIV - Integer-Division 440
2.3.25 FIDIVR - reziproke Integer-Division 441
2.3.26 FILD - Integer laden 441
2.3.27 FIMUL - Integer-Multiplikation 442
2.3.28 FINCSTP - Stapelzeiger inkrementieren 443
2.3.29 FINIT/FNINIT - FPU initialisieren 443
2.3.30 FIST - Integer speichern 444
2.3.31 FISTP - Integer speichern und POP-Operation 444
2.3.32 FISUB - Integer-Subtraktion 445
2.3.33 FISUBR - reverse Integer-Subtraktion 446
2.3.34 FLD - Fließkommazahl laden 446
2.3.35 FLDCW - Steuerregister laden 447
2.3.36 FLDENV - FPU-Umgebung laden 448
2.3.37 FLDLG2 - Konstante log10 2 laden 448
2.3.38 FLDLN2 - Konstante ln2 laden 449
2.3.39 FLDL2E - Konstante log2 e laden 449
2.3.40 FLDL2T - Konstante log2 10 laden 450
2.3.41 FLDPI - Konstante pi laden 450
2.3.42 FLDZ - Null laden 451
2.3.43 FLD1 - Eins laden 451
2.3.44 FMUL - Multiplikation 452
2.3.45 FMULP - Multiplikation und POP-Operation 453
2.3.46 FNOP - Keine Operation 453
2.3.47 FPATAN - Arcus-Tangens 454
2.3.48 FPREM - Modulo-Operation 455
2.3.49 FPREM1 - Modulo-Operation nach IEEE 455
2.3.50 FPTAN - Tangens 456
2.3.51 FRNDINT - Rundung auf nächste ganze Zahl 456
2.3.52 FRSTOR - FPU-Zustand wieder herstellen 457
2.3.53 FSAVE/FNSAVE - FPU-Zustand sichern 458
2.3.54 FSCALE - Skalierung 458
2.3.55 FSETPM - in Protected-Mode umschalten 459
2.3.56 FSIN - Sinus 460
2.3.57 FSINCOS - Sinus und Kosinus 460
2.3.58 FSQRT - Quadratwurzel 461
2.3.59 FST - Fließkommazahl speichern 462
2.3.60 FSTCW/FNSTCW - Steuerregister speichern 462
2.3.61 FSTENV/FNSTENV - FPU-Zustand speichern 463
2.3.62 FSTP - Fließkommazahl speichern und POP-Operation 464
2.3.63 FSTSW/FNSTSW - Statusregister speichern 465
2.3.64 FSUB - Subtraktion 465
2.3.65 FSUBP - Subtraktion und POP-Operation 466
2.3.66 FSUBR - reverse Subtraktion 467
2.3.67 FSUBRP - reverse Subtraktion und POP-Operation 468
2.3.68 FTST - Test auf Null 469
2.3.69 FUCOM - ungeordneter Vergleich 469
2.3.70 FUCOMP - ungeordneter Vergleich und POP-Operation 470
2.3.71 FUCOMPP - ungeord. Vergleich und 2 POP-Operationen 471
2.3.72 FWAIT - CPU anhalten, solange FPU aktiv 472
2.3.73 FXAM - Stapelspitze untersuchen 472
2.3.74 FXCH - Registerinhalt austauschen 473
2.3.75 FXTRACT - Aufspaltung in Exponent und Mantisse 474
2.3.76 FYL2X - y x log2 x berechnen 474
2.3.77 FY2XP1 - y x log2 (x+1) berechnen 475


3 Die Operatoren 477

3.1 Erläuterungen zur Referenz 477
3.1.1 Syntax 477
3.1.2 Beschreibung 477
3.1.3 Modus 477
3.1.4 Beispiele 477

3.2 Referenz der Operatoren 478
3.2.1 () - Klammerung 478
3.2.2 * - Multiplikation 478
3.2.3 Binäres + - Addition 479
3.2.4 Unäres + - positives Vorzeichen 479
3.2.5 Binäres Subtraktion 480
3.2.6 Unäres Vorzeichenwechsel 481
3.2.7 Strukturauswahl . - Zugriff auf Elementvariablen 481
3.2.8 / - Division 482
3.2.9 Vorgabe : - relative Adressangabe 482
3.2.10 ? - Initialisierung mit unbestimmten Werten 483
3.2.11 [ ] - Addition bzw. indirekte Adressierung 484
3.2.12 ; - Kommentare 484
3.2.13 ADDR - Adresse eines Ausdrucks ermitteln 485
3.2.14 AND - bitweises Und 485
3.2.15 BYTE - Datentyp Byte vorgeben 486
3.2.16 CODEPTR - Standardadressgröße für Code 486
3.2.17 DATAPTR - Standardadressgröße für Daten 487
3.2.18 DUP - Datendefinitionen wiederholen 487
3.2.19 DWORD - Datentyp Double-Word vorgeben 488
3.2.20 EQ - Test "gleich" 489
3.2.21 FAR - Ausdruck in 32-Bit-Far-Zeiger wandeln 489
3.2.22 FWORD - Ausdruck in 48-Bit-Far-Zeiger wandeln 490
3.2.23 GE - Test "größer als oder gleich" 490
3.2.24 GT - Test "größer als 491
3.2.25 HIGH - liefert den höherwertigen Teil eines Ausdrucks 491
3.2.26 HIGHWORD - liefert das höherwertige Word 492
3.2.27 LARGE - Ausdruck in 32-Bit-Wert wandeln 492
3.2.28 LE - Test "kleiner als oder gleich" 493
3.2.29 LENGTH - Anzahl der Datenobjekte ermitteln 494
3.2.30 LENGTHOF - Anzahl der (Array-)Datenobjekte ermitteln 494
3.2.31 LOW - liefert den niederwertigen Teil eines Ausdrucks 495
3.2.32 LOWWORD - liefert das niederwertige Word 496
3.2.33 LROFFSET - LR-Offset eines Ausdrucks 496
3.2.34 LT - Test "kleiner als" 497
3.2.35 MASK - Bitmaske für Record-Feld erstellen 497
3.2.36 MOD - Modulo-Operation 498
3.2.37 NE - Test "nicht gleich" 499
3.2.38 NEAR - Ausdruck in 16-Bit-Near-Zeiger wandeln 499
3.2.39 NOT - Einer-Komplement aller Bits bilden 500
3.2.40 OFFSET - Liefert den Offset eines Ausdrucks 500
3.2.41 OR - bitweises Oder 501
3.2.42 PROC - Programmcodezeiger erzwingen 501
3.2.43 PTR - anderen Datentyp erzwingen 502
3.2.44 PWORD - Ausdruck in 32-Bit-Far-Zeiger wandeln 503
3.2.45 QWORD - Datentyp Quad-Word vorgeben 503
3.2.46 SEG - Segmentadresse ermitteln 504
3.2.47 SHL - links schieben 505
3.2.48 SHORT - kurzen Codezeiger erzwingen 505
3.2.49 SHR - rechts schieben 506
3.2.50 SIZE - Speicherbedarf eines Ausdrucks liefern 506
3.2.51 SIZEOF - Speicherbedarf eines Ausdrucks liefern 507
3.2.52 SMAIL - Ausdruck als 16-Bit-Wert festlegen 507
3.2.53 SYMTYPE - Datentyp ermitteln 508
3.2.54 TBYTE - 10-Byte-Datentyp vorgeben 509
3.2.55 THIS - Zeiger mit aktueller Adresse erzeugen 509
3.2.56 TYPE - Datentyp ermitteln 510
3.2.57 TYPE - Datentyp und -große ermitteln 511
3.2.58 UNKNOWN - alle Typinformationen entfernen 512
3.2.59 WIDTH - Bitanzahl in Record oder Record-Feld ermitteln 512
3.2.60 WORD - Datentyp Word vorgeben 513
3.2.61 XOR - bitweises Exklusiv-Oder 514

3.3 Referenz der Makrooperatoren 514
3.3.1 & - Substitution 514
3.3.2 < > - Text direkt einfügen 515
3.3.3 ! - Fluchtzeichen 516
3.3.4 % - Ausdrücke auswerten 517
3.3.5 ;; - Kommentare unterdrücken 517


4 Die Assembler-Anweisungen 5l9

4.1 Erläuterungen zur Anweisungen-Referenz 519
4.1.1 Syntax 519
4.1.2 Beschreibung 519
4.1.3 Modus 519

4.2 Referenz der Anweisungen 520
4.2.1 x86, x87 - Befehlssatz des 80x86 und 80x87 aktivieren 520
4.2.2 : - Near-Code-Label definieren 521
4.2.3 = - Konstante deklarieren 522
4.2.4 ALIGN - aktuelle Position auf Zweier-Potenz aufrunden 522
4.2.5 .ALPHA - alphabetische Segment-Reihenfolge festlegen 523
4.2.6 ARG -Argumente in Unterprogrammen anlegen 523
4.2.7 ASSUME - Segmentregister mit Segment/Gruppe verbinden 525
4.2.8 .BREAK - While- oder Repeat-Block verlassen 525
4.2.9 BYTE - Byte-Variablen anlegen 526
4.2.10 CALL - High-Level-Call von TASM 526
4.2.11 CATSTR - Strings verbinden 527
4.2.12 .CODE - Code-Segment einleiten 528
4.2.13 CODESEG - Code-Segment einleiten 528
4.2.14 COMM - gemeinsame Variablen definieren 529
4.2.15 COMMENT - mehrzeilige Kommentare 530
4.2.16 %CONDS - alle Anweisungen bedingter Blöcke ausgeben 530
4.2.17 .CONST - Datensegment mit Konstanten definieren 531
4.2.18 CONST - Datensegment mit Konstanten definieren 531
4.2.19 .CREF - Cross-Referenz erstellen 532
4.2.20 %CREF - Cross-Referenz erstellen 532
4.2.21 .DATA - Daten-Segment einleiten 533
4.2.22 .DATA? - Segment für nicht initialisierte Daten einleiten 533
4.2.23 DATASEG - Daten-Segment einleiten 534
4.2.24 DB - Byte-Variablen anlegen 534
4.2.25 DD - Double-Word-Variablen anlegen 535
4.2.26 DF - 48-Bit-Variablen anlegen 536
4.2.27 DISPLAY - String während Assemblierung ausgeben 536
4.2.28 .DOSSEG - Link-Reihenfolge für DOS-Segmente festlegen 537
4.2.29 DOSSEG - Link-Reihenfolge für DOS-Segmente festlegen 537
4.2.30 DP - 48-Bit-Variablen anlegen 538
4.2.31 DQ - Quad-Word-Variablen anlegen 538
4.2.32 DT - 10-Byte-Variablen anlegen 539
4.2.33 DW - Word-Variablen anlegen 540
4.2.34 DWORD - Double-Word-Variablen anlegen 540
4.2.35 ECHO - String während Assemblierung ausgeben 541
4.2.36 EMUL - Koprozessorbefehle emulieren 541
4.2.37 END - Ende der Quelltextdatei 542
4.2.38 ENUM -Aufzählungstyp deklarieren 542
4.2.39 EQU - Name für Konstante oder Alternativnamen festlegen 543
4.2.40 .ERR - Fehlermeldung erzwingen 543
4.2.41 ERR - Fehlermeldung erzwingen 544
4.2.42 .ERR1 - Fehlermeldung im ersten Pass erzwingen 544
4.2.43 .ERR2 - Fehlermeldung im zweiten Pass erzwingen 545
4.2.44 .ERRB - Fehlermeldung, wenn Argument leer ist 546
4.2.45 .ERRDEF - Fehlermeldung, wenn Symbol definiert ist 546
4.2.46 .ERRDIF - Fehlermeldung, wenn Argumente nicht gleich 547
4.2.47 .ERRDIFI - Fehlermeldung, wenn Argumente nicht gleich 547
4.2.48 .ERRE - Fehlermeldung, wenn Argument falsch 548
4.2.49 .ERRIDN - Fehlermeldung, wenn Argumente gleich 549
4.2.50 .ERRIDNI - Fehlermeldung, wenn Argumente gleich 549
4.2.51 ERRIF - Fehlermeldung, wenn Argument wahr 550
4.2.52 ERRIF1 - Fehlermeldung in Pass 1, wenn Argument wahr 550
4.2.53 ERRIF2 - Fehlermeldung in Pass 2, wenn Argument wahr 551
4.2.54 ERRIFB - Fehlermeldung, wenn Argument leer 551
4.2.55 ERRIFDEF - Fehlermeldung, wenn Symbol definiert ist 552
4.2.56 ERRIFDIF - Fehlermeldung, wenn Argumente nicht gleich 552
4.2.57 ERRIFDIFI - Fehlermeldung, wenn Argumente nicht gleich 553
4.2.58 ERRIFE - Fehlermeldung, wenn Argument falsch 553
4.2.59 ERRIFIDN - Fehlermeldung, wenn Argumente identisch 554
4.2.60 ERRIFIDNI - Fehlermeldung, wenn Argumente identisch 554
4.2.61 ERRIFNB - Fehlermeldung, wenn Argument nicht leer 555
4.2.62 ERRIFNDEF - Fehlermeldung, wenn Symbol nicht definiert 555
4.2.63 .ERRNB - Fehlermeldung, wenn Argument nicht leer 556
4.2.64 .ERRNDEF - Fehlermeldung, wenn Symbol nicht definiert 556
4.2.65 .ERRNZ - Fehlermeldung, wenn Argument wahr 557
4.2.66 EVEN - zum nächsten geradzahligen Offset runden 557
4.2.67 EVENDATA - zum nächsten geradzahligen Offset runden 558
4.2.68 .EXIT - Terminierungscode für Programm erzeugen 558
4.2.69 EXITCODE - Terminierungscode für Programm erzeugen 559
4.2.70 EXITM - Makro oder Blockwiederholung beenden 559
4.2.71 EXTERN - externes Symbol einbinden 560
4.2.72 EXTRN - externes Symbol einbinden 560
4.2.73 .FARDATA - Far-Datensegment einleiten 561
4.2.74 .FARDATA? - nicht initialisiertes Far-Segment einleiten 562
4.2.75 FARDATA - Far-Datensegment einleiten 562
4.2.76 FASTIMUL - Multiplikation von zwei Integer-Werten 563
4.2.77 FLIPFLAG - logisches Exklusiv-Oder 563
4.2.78 FOR - Blockwiederholung mit String-Ersetzung 564
4.2.79 FORC - Blockwiederholung mit String-Ersetzung 564
4.2.80 FWORD - 48-Bit-Variablen anlegen 565
4.2.81 GETFIELD - Zielregister Wert von Record-Feld zuweisen 565
4.2.82 GLOBAL - globales Symbol definieren 565
4.2.83 GOTO - Sprung an Makro-Label 566
4.2.84 GROUP - Segmente zu Gruppen zusammenfassen 567
4.2.85 IDEAL - TASM in den Ideal-Modus schalten 567
4.2.86 .IF - bedingte Verzweigung 568
4.2.87 IF - bedingte Assemblierung 569
4.2.88 IF1 - bedingte Assemblierung in Pass l 570
4.2.89 IF2 - bedingte Assemblierung in Pass 2 570
4.2.90 IFB - Assemblierung, wenn Ausdruck leer 571
4.2.91 IFDEF - Assemblierung, wenn Symbol definiert 572
4.2.92 IFDIF - Assemblierung, wenn Argumente nicht gleich 572
4.2.93 IFDIFI - Assemblierung, wenn Argumente nicht gleich 573
4.2.94 IFE - Assemblierung, wenn Ausdruck falsch 574
4.2.95 IFIDN - Assemblierung, wenn Argumente gleich 574
4.2.96 IFIDNI - Assemblierung, wenn Argumente gleich 575
4.2.97 IFNB - Assemblierung, wenn Argument nicht leer 575
4.2.98 IFNDEF - Assemblierung, wenn Symbol nicht definiert 576
4.2.99 INCLUDE - Quelltext aus anderer Datei einfügen 577
4.2.100 INCLUDELIB - Linker anweisen, Bibliothek einzubinden 577
4.2.101 INSTR - Substring in String suchen 578
4.2.102 INVOKE - High-Level-Call von MASM 578
4.2.103 IRP - Blockwiederholung mit String-Ersetzung 579
4.2.104 IRPC - Blockwiederholung mit String-Ersetzung 579
4.2.105 JUMPS - automatische Anpassung für bedingte Sprünge 580
4.2.106 LABEL - Label für einen Datentyp festlegen 581
4.2.107 .LALL - Makroerweiterungen in Listing aufnehmen 581
4.2.108 LARGESTACK - Stapel im 32-Bit-Modus verwalten 582
4.2.109 .LFCOND - alle Anweisungen bedingter Blöcke ausgeben 582
4.2.110 .LIST - alle Zeilen in Listing ausgeben 582
4.2.111 %LIST- alle Zeilen in Listing ausgeben 583
4.2.112 .LISTALL - alles auflisten 583
4.2.113 .LISTIF - alle Anweisungen bedingter Blocks ausgeben 584
4.2.114 .LISTMACRO - nur code/datenerzeug. Makroteile listen 584
4.2.115 .LISTMACROALL - Makroerweiterungen auflisten 584
4.2.116 LOCAL - lokale Symbole in Makros 585
4.2.117 LOCAL - lokale Variablen definieren 585
4.2.118 LOCALS - lokale Symbole aktivieren 587
4.2.119 MACRO - Makro definieren 587
4.2.120 %MACS - Makroerweiterungen in Listing aufnehmen 588
4.2.121 MASKFLAG - logisches Und 589
4.2.122 MASM - schaltet TASM in den MASM-Modus 589
4.2.123 MASM51 - MASM-5.1-Erweiterungen in TASM aktivieren 589
4.2.124 .MODEL - Speichermodell festlegen 590
4.2.125 MODEL - Speichermodell festlegen 592
4.2.126 NAME - Modulnamen festlegen 592
4.2.127 %NEWPAGE - neue Seite in Listing-Datei 593
4.2.128 %NOCONDS - nur assemblierte bedingte Blöcke listen 593
4.2.129 %NOCREF - keine Cross-Referenz erstellen 593
4.2.130 .NO87 - Assemblierung von FPU-Befehlen deaktivieren 594
4.2.131 .NOCREF - Cross-Referenz abschalten 594
4.2.132 NOEMUL - keine Emulation von FPU-Befehlen 595
4.2.133 NOJUMPS - automat. Sprunganpassung deaktivieren 595
4.2.134 %NOLIST - Ausgabe in Listing-Datei abschalten 596
4.2.135 .NOLIST - Ausgabe in Listing-Datei abschalten 596
4.2.136 .NOLISTIF - nur assemblierte bedingte Blöcke listen 596
4.2.137 .NOLISTMACRO - Makroerweiterungen nicht auflisten 597
4.2.138 NOLOCALS - lokale Symbole deaktivieren 597
4.2.139 %NOMACS - nur daten/codeerzeug. Makroteile listen 598
4.2.140 NOMASM51 - MASM-5.1-Erweiterungen deaktivieren 598
4.2.141 NOSMART - Optimierung abschalten 598
4.2.142 OPTION - Optionen in MASM ab 6.1 setzen 599
4.2.143 ORG - Position im aktuellen Segment festlegen 601
4.2.144 %OUT - Meldung auf dem Bildschirm ausgeben 601
4.2.145 Px86; Px87 - Befehlssatz des 80x86 und 80x87 aktivieren 602
4.2.146 PAGE - Format von Listing-Seite festlegen 603
4.2.147 %PAGESIZE - Format von Listing-Seite festlegen 604
4.2.148 PNO87 - Assemblierung von FPU-Befehlen deaktivieren 604
4.2.149 PROC - Unterprogramme definieren 605
4.2.150 PROCDESC - Prototyp einer Routine deklarieren 607
4.2.151 PROCTYPE - Typ einer Routine deklarieren 608
4.2.152 PROTO - Prototyp einer Routine deklarieren 609
4.2.153 PUBLIC - Symbole global deklarieren 609
4.2.154 PUBLICDLL - Symbole aus DLL exportieren 610
4.2.155 PURGE - Makrodefinition entfernen 610
4.2.156 QUIRKS - MASM-Fehlermodus in TASM aktivieren 611
4.2.157 QWORD - Quad-Word-Variablen anlegen 611
4.2.158 .RADIX - Standardzahlenbasisfestlegen 612
4.2.159 RADIX - Standardzahlenbasis festlegen 612
4.2.160 REAL4 - 32-Bit-Fließkommavariablen anlegen 612
4.2.161 REAL8 - 64-Bit-Fließkommavariablen anlegen 613
4.2.162 REAL10 - 80-Bit-Fließkommavariablen anlegen 614
4.2.163 RECORD - Bitfelder deklarieren 614
4.2.164 .REPEAT - Code für Schleife generieren 615
4.2.165 REPEAT - Blockwiederholung 616
4.2.166 REPT - Blockwiederholung 616
4.2.167 .SALL - keine Auflistung von Makroerweiterungen 617
4.2.168 SBYTE - Signed-Byte-Variablen anlegen 617
4.2.169 SDWORD - Signed-Double-Word-Variablen anlegen 618
4.2.170 SEGMENT - Segmente definieren 618
4.2.171 .SEQ - sequentielle Segment-Reihenfolge festlegen 620
4.2.172 SETFIELD - Record-Feld Wert zuweisen 621
4.2.173 SETFLAG - logisches Oder 621
4.2.174 .SFCOND - nur assemblierte bedingte Blöcke listen 622
4.2.175 SIZESTR - Länge einer String-Konstante ermitteln 622
4.2.176 SMALLSTACK - Stapel im 16-Modus verwalten 622
4.2.177 SMART - Optimierungen aktivieren 623
4.2.178 .STACK - Stapelsegment anlegen 623
4.2.179 STACK - Stapelsegment anlegen 624
4.2.180 .STARTUP - Initialisierungscode erzeugen 624
4.2.181 STARTUPCODE - Initialisierungscode erzeugen 625
4.2.182 STRUC - Datenstrukturen aufbauen 625
4.2.183 STRUCT - Datenstrukturen aufbauen 626
4.2.184 SUBSTR - Teilstring ermitteln 626
4.2.185 SUBTITLE - Listing-Untertitel festlegen 627
4.2.186 SUBTTL - Listing-Untertitel festlegen 627
4.2.187 %SUBTTL - Listing-Untertitel festlegen 628
4.2.188 SWORD - Signed-Word-Variablen anlegen 628
4.2.189 TBYTE - 10-Byte-Variablen anlegen 629
4.2.190 TESTFLAG - logischer Vergleich 629
4.2.191 TEXTEQU - String-Konstanten anlegen 630
4.2.192 .TFCOND - bedingte Blöcke auflisten 630
4.2.193 TITLE - Listing-Titel festlegen 631
4.2.194 %TITLE - Listing-Titel festlegen 631
4.2.195 TYPEDEF - Datentyp definieren 631
4.2.196 UDATASEG - nicht initialisiertes Datensegment einleiten 632
4.2.197 UFARDATA - nicht initialisiertes Far-Segment einleiten 632
4.2.198 UNION - Variante aufbauen 633
4.2.199 USES - Register in einer Prozedur retten 633
4.2.200 .WHILE - Schleifencode generieren 634
4.2.201 WHILE - Blockwiederholung 634
4.2.202 .XALL - nur daten/code-erzeugende Makroteile listen 635
4.2.203 .XCREF - Cross-Referenz nicht erstellen 635
4.2.204 .XLIST - Ausgabe in Listing-Datei deaktivieren 635

4.3 Referenz der OO-Erweiterungen von TASM 636
4.3.1 CALL- Methoden aufrufen 636
4.3.2 JMP - Sprung zu einer Methode 636
4.3.3 STRUC - Klasse deklarieren 637
4.3.4 TABLE - Tabellenstruktur für die Methodenzeiger erstellen 638
4.3.5 TBLINIT - Tabelle der virtuellen Methoden initialisieren 639
4.3.6 TBLINST - Tabelle der virtuellen Methoden erzeugen 639
4.3.7 TBLPTR - Zeiger auf Virtuelle-Methoden-Tabelle erzeugen 639