[home] [<-back] [index] [next->]
____________________________________________________________________ [2:. - [ Maschinenbefehle des 8068 ] [ireg] :. ] [ireg@luschen.at] :. ] ____________________________________________________________________ Der folgende Text ist nur für hartgesottene Masochisten. Mit Assembler hab ich mich früher viel beschäftigt, als ich noch meinen Sinclair Spectrum gehabt habe. Heute programmiere ich nur noch in Visual Basic, PHP oder arbeite an HTML. Das Hardcorezeug ist nichts mehr für mich. Die Auflistung beinhaltet alle Befehle des 8086 mit einer Beschreibung und Taktangaben für den benötigten Zeitbedarf. Viel Spass beim lesen was es alles für Befehle gibt. _______________________________________________________________________ Auflistung aller Befehle: AAA AAD AAM AAS ADC ADD AND CALL CBW CLC CLD CLI CMC CMP CMPS CWD DAA DAS DEC DIV ESC HLT IDIV IMUL IN INC INT INTO IRET JMP LAHF LDS LEA LES LOCK LODS LOOP LOOPE/LOOPZ LOOPNE/LOOPNZ MOV MOVS NEG NOP NOT OR OUT POP POPF PUSH PUSHF RCL RCR REP RET ROL ROR SAHF SAL SAR SBB SCAS SHL SHR STC STD STI STOS SUB TEST WAIT XCHG XLAT XOR Legende Flags: O - Overflow D - Direction I - Interupt T - Trag S - Sign Z - Zero A - Auxiliary P - Parity C - Cary (!=Changed,?=Not Defined,*=Unchanged,0=0,1=1) Befehl: () Flags: O,D,I,T,S,Z,A,P,C Beschreibung: Beispiel: Zeitbedarf: Takte ---------------------------- Zurück zur Auflistung Befehl: AAA (ASCII Adjust for Addition) Korrektur nach einer ASCII-Addition (ungepackte BCD-Addition) Flags: O?,D*,I*,T*,S?,Z?,A!,P?,C! Beschreibung: AAA wandelt das duale Additionsergebnis im AL-Register in eine BCD-ZAhl im AH und AL Register. Beispiel: mov al,7 ;AL = 7 add al,8 ;AL = AL + 8 -> AL = 0Fh = 15d aaa ;AH = 1 und AL = 5 -> BCD-Zahl 15 Zeitbedarf: 4 Takte ---------------------------- Zurück zur Auflistung Befehl: AAD (ASCII Adjust for Division) Koorektur vor einer ASCII-Division (ungepackte BCD-Division) Flags: O?,D*,I*,T*,S!,Z!,A?,P!,C? Beschreibung: AAD wandelt die BCD-Zahl im AH- und AL-Register in eine Dualzahl um, welche sich anschließend im AL-Register befindet. Das AH-Register wird auf 0 gesetzt. Beispiel: mov ah,7 ;AH = 7 aov al,1 ;AL = 1 -> AX = 0701 -> BCD-Zahl 71 aad ;AX = 0047 -> 47h = 71d Zeitbedarf: 60 Takte ---------------------------- Zurück zur Auflistung Befehl: AAM (ASCII Adjust for Multiplication) Kooerktur nach einer ASCII-Multiplikation (ungepackte BCD-Multiplikation) Flags: O?,D*,I*,T*,S!,Z!,A?,P!,C? Beschreibung: AAM wandelt das duale Multiplikationsergebnis im AX-Register in eine BCD-Zahl im AH- und AL-Register um. Beispiel: mov al,8 ;AL = 8 mov ah,2 ;AH = 2 mul ah ;AX = AL * AH = 0010h = 16d aam ;AH = 01 und AL = 06 -> BCD-Zahl 16 Zeitbedarf: 83 Takte ---------------------------- Zurück zur Auflistung Befehl: AAS (ASCII Adjust for Subtraction) Korrektur nach einer ASCII-Subtraktion (ungepackte BCD-Subtraktion) Flags: O?,D*,I*,T*,S?,Z?,A!,P?,C! Beschreibung: AAS wandelt das Subtraktionsergebnis im AX-Register in eine BCD-Zahl um. Beispiel: mov ah,8 ;AH = 8 mov al,4 ;AL = 4 sub al,8 ;AX = 08FCh aas ;AX = 0406 -> BCD-Zahl 76 Zeitbedarf: 4 Takte ---------------------------- Zurück zur Auflistung Befehl: ADC Ziel,Quelle (ADd with Carry) Addiere mit Carry-übertrag Flags: O!,D*,I*,T*,S!,Z!,A!,P!,C! Beschreibung: ADC addiert den Inhalt der beiden Operanden Ziel und Quelle mit dem Carry Flag auf dem Ziel-Operanden. ADC wird besonders bei der Addition von 32-Bit-Werten benötigt. Beispiel: Auf einem 32-Bit-Wert, der im Registerpaar DX:AX abgespeichert ist, soll ein Wert addiert werden. Da wir das Registerpaar DX:AX nicht direkt ansprechen können, müssen wir den Wert erst auf das AX-Register addieren. War das Ergebnis im AX-Register grösser 65535, ensteht ein übertrag aus dem AX-Register, welcher im Carry Flag abgelegt wird. Dieser übertrag muß mit dem ADC-Befehl auf das höherwertige Wort im DX-Register addiert werden. add ax,1234 ;Addiere zu dem Wert in DX:AX 1234 ;(dezimal) jc Ueber ;Wertebereich des AX-Registers ;überschritten . Ueber: adc dx,0 ;übertrag auf das höherwertige Wort ;addieren Zeitbedarf: 3 Takte bei ADC Reg,Reg 4 Takte bei ADC Reg,Wert 9 Takte bei ADC Reg,Mem 16 Takte bei ADC Mem,Reg ---------------------------- Zurück zur Auflistung Befehl: ADD Ziel,Quelle (ADD Addiere) Flags: O!,D*,I*,T*,S!,Z!,A!,P!,C! Beschreibung: ADD addiert die Inhalte des Ziel- und Quelloperanden und legt das Ergebnis im Zieloperanden ab. Beispiel: : mov ah,5 ;AH = 5 add ah,5 ;AH = AH + 5 = 10 Zeitbedarf: 3 Takte bei ADD Reg,Reg 4 Takte bei ADD Reg,Wert 9 Takte bei ADD Reg,Mem 16 Takte bei ADD Mem,Reg ---------------------------- Zurück zur Auflistung Befehl: AND Ziel,Quelle (AND Logisches Und) Flags: O0,D*,I*,T*,S!,Z!,A?,P!,C0 Beschreibung: AND verknüpft den Zieloperanden bitweise mit dem Quelloperanden nach der logischen UND-Verknüpfung und legt das Ergebnis im Zieloperanden ab. op1 op2 op1 AND op2 0 0 0 0 1 0 1 0 0 1 1 1 Beispiel: mov ah,5 ;AH = 5d = 0101b mov al,3 ;AL = 3d = 0011b and ah,al ;AH = 1d = 0001b Zeitbedarf: 3 Takte bei AND Reg,Reg 4 Takte bei AND Reg,Wert 9 Takte bei AND Reg,Mem 16 Takte bei AND Mem,Reg ---------------------------- Zurück zur Auflistung Befehl: CALL Adr (CALL Aufruf eines Unterprogramms) Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: Call bewirkt das Laden einer Adresse, die beim CALL-Befehl angegeben ist, in den Instruction-Pointer. Dies bewirkt, daß die Programmausführung an der durch Adr angegebenen Adresse fortgeführt wird. Zuvor wird die aktuelle Adresse des IP auf dem Stack gesichert. Dieser Wert wird bei der Beendigung des Unterprogramms durch einen RET-Befehl wieder vom Stack genommen und in den IP geladen. (Beim FAR-Call wird zusätzlich das CS-Register auf dem Stack zwischengespeichert). Beispiel: . <1> call UP ;Aufruf des Unterprogramms UP <2> . ; UP PROC ;Anfang des Unterprogramms UP . ; ; . ; ret ;Zurück zum Aufrufer <2> Zeitbedarf: 19 Takte bei einem NEAR Unterprogramm 28 Takte bei einem FAR Unterprogramm ---------------------------- Zurück zur Auflistung Befehl: CBW (Convert Byte to Word) Umwandlung eines Bytes im AL-Register in ein Wort im AX-Register Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: CBW wandelt einen Byte-Wert mit Vorzeichen im AL-Register in einen vorzeichenbehafteten Wort-Wert im AX-Register um. Ist das Vorzeichen-Bit in AL positiv (Bit 7 = 0), wird der Wert 00h in das AH-Register transportiert. Im umgekehrten Fall (Bit 7 = 1 -> Negativ) wird der Wert FFh in das AH-Register gestellt. Der CBW wird immer dann benötigt, wenn ein 8-Bit Operand in einer 16-Bit-Operation, die das Vorzeichen berücksichtigt, verwendet werden soll (beispielsweise IMUL oder IDIV). Beispiel: xor ax,ax ;AX = 0000 0000 0000 0000b mov al,01101111b ;AX = 0000 0000 0110 1111b cbw ;AX = 0000 0000 0110 1111b xor ax,ax ;AX = 0000 0000 0000 0000b mov al,11110000b ;AX = 0000 0000 1111 0000b cbw ;AX = 1111 1111 1111 1111b Zeitbedarf: 2 Takte ---------------------------- Zurück zur Auflistung Befehl: CLC (CLear Cary flag) Lösche das übertragungs-Flag (CF=0) Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C0 Beschreibung: CLC setzt das Carry Flag (CF) auf 0. Oft wird das Carry Flag als Schalter benutzt. Der Befehl STC setzt das Carry Flag auf 1. Mit dem Befehl CLC kann das übertragsflag auf 0 gesetzt werden und so beispielsweise eine erfolgreiche Ausführung signalisieren. Auch muß bei Befehlen wie ADC, RCL und SBB das Cary Flag manchmal gelöscht werden. Beispiel: : clc ;Setze das Carry-Flag auf 0 call Up ;Aufruf Unterprogramm - Schalter CF = 0 jc Fehler ;Wenn CF = 1 springe zu Fehler Zeitbedarf: 2 Takte ---------------------------- Zurück zur Auflistung Befehl: CLD (CLear Direction flag) Lösche das Richtungs-Flag (DF = 0) Flags: O*,D0,I*,T*,S*,Z*,A*,P*,C* Beschreibung: CLD setzt das Direction Flad (DF) auf 0. Dadurch arbeiten alle Stringoperationen in Richtung der größer werdenden Adressen, also von links nach rechts (default). Beispiel: . std ;Alle Stringoperationen arbeiten von rechts ;nach links stosb ;Stringoperation . cld ;Alle Stringoperationen arbeiten von links ;nach rechts movsb Zeitbedarf: 2 Takte ---------------------------- Zurück zur Auflistung Befehl: CLI (CLear Interrupt flag) Lösche das Interrupt (IF=0) Flags: O*,D*,I0,T*,S*,Z*,A*,P*,C* Beschreibung: CLI setzt das Interrupt Flag auf 0. Damit werden keine externen Interrupts mehr zugelassen. Dieser Befehl wird besonders in Zeitkritischen Phasen benötigt, wo jeder Interrupt stören würde. Beispiel: cli ;extern maskierbare Interrups sperren ;(erstmal Ruhe) ; sti ;extern maskierbare Interrupts wieder ;zulassen Zeitbedarf: 2 Takte ---------------------------- Zurück zur Auflistung Befehl: CMC (CoMplement Cary flag) Drehe den Zustand des Carry Flags um Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C! Beschreibung: CMC dreht den zustand des Carry-Flags um, das heißt, wenn CF = 1 ist, wird es auf 0 gesetzt und umgekehrt. Dies ist sinnvoll beim ADC- und beim SBB-Befehl. Beispiel: clc ;CF = 0 cmc ;cf = 1 Zeitbedarf: 2 Takte ---------------------------- Zurück zur Auflistung Befehl: CMP Ziel,Quelle (CoMPare two operands) Vergleiche zwei Operanden Flags: O!,D*,I*,T*,S!,Z!,A!,P!,C! Beschreibung: Der CMP-Befehl vergleicht zwei Operanden miteinander. Beide Operanden müssen gleich groß sein (Byte, Byte oder Wort,Wort). Das Ergebnis wird im Statusregister angezeigt. Beispiel: mov ah,7 ;AH = 7 cmp ah,max ;vergleiche AH-Register mit der ;Variablen max je Gleich ;wenn nicht - springe zum Label ;Gleich: jg Groesser ;wenn größer - springe zum Label ;Groesser: jl Kleiner ;wenn kleiner - springe zum Label ;Kleiner: . Gleich: ; Groesser: ; Kleiner: ; Zeitbedarf: 3 Takte bei CMP Reg,Reg 4 Takte bei CMP Reg,Wert 9 Takte bei CMP Reg,Mem 16 Takte bei CMP Mem,Reg ---------------------------- Zurück zur Auflistung Befehl: CMPS Ziel,Quelle CMPSB(CoMPare Strings Bytes) CMPSW(CoMParw String Words Vergleiche zwei Zeichenketten byte- oder wortweise Flags: O!,D*,I*,T*,S!,Z!,A!,P!,C! Beschreibung: CMPS vergleicht die Inhalte zweier Zeichenketten miteinander. Der Zielstring wird durch das Registerpaar ES:DI adressiert, der Quell-String durch das Registerpaar DS:SI. Der CMPS-Befehl wird mit den Wiederholungs-Präfixen REPE/REPNE eingesetzt. So können Texte auf übereinstimmung miteinander verglichen werden. Nach einem Vergleich werden die beiden Index-Register DI und SI, entsprechend den gesetzten Direction-Flag, automatisch erhöht oder gesenkt. Beispiel: lea di,Ziel ;Index-Register DI zeigt auf den Ziel- ;String lea si,Quelle ;Index-Register SI zeigt auf den Quell- ;String cmpsb ;vergleiche Ziel und Quelle byteweise cmpsw ;vergleiche Ziel und Quelle wortweise Zeitbedarf: 22 Takte (pro Vergleich) ---------------------------- Zurück zur Auflistung Befehl: CWD (Convert Word to Dubleword) Umwandlung Inhelt des AX-Registers in ein Doppel-Wort, welches im Registerpaar DX:AX abgelegt wird Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: CWD setzt alle Bits im DX-Register auf den gleichen Wert wie das Corzeichenbit (Bit 15) im AX-Register. Das bedeutet, ist das Vorzeichenbit im AX positiv (Bit 15 = 0) wird der Wert 0000h nach DX geschoben, ist AX negativ (Bit 15 = 0) wird der wert FFFFhin das DX-Register transportiert. Der CWD-Befehl wird immer dann benötigt, wenn ein 16-Bit-Operand in einer 32-Bit-Operation, die das Vorzeichen berücksichtigt verwendet werden soll (beispielsweise IDIV). Beispiel: mov ax,1000 mov bx,330 cwd ;Vorzeichen AX nach DX verlängern idiv bx ;Wort/Wort=Ergebnis in AX, Rest in DX Zeitbedarf: 5 Takte ---------------------------- Zurück zur Auflistung Befehl: DAA (Decimal Adjust for Addition) Korrektur nach einer gepackten BCD-Addition Flags: O?,D*,I*,T*,S!,Z!,A!,P!,C! Beschreibung: DAA ist dem Befehl AAA ähnlich, mit dem Unterschied, daß bei der DAA gepackte BCD-Zahlen korrigiert werden. Beispiel: mov al,8 ;AL = 08h add al,3 ;Al = 0Bh daa ;AL = 11 (BCD-Darstellung) Zeitbedarf: 4 Takte ---------------------------- Zurück zur Auflistung Befehl: DAS (Decimal Adjust for Subtraction) Korrektur nach einer gepackten BCD-Subtraction Flags: O!,D*,I*,T*,S!,Z!,A!,P!,C! Beschreibung: DAS wandelt das Subtraktionsergebnis im AL-Register in eine gültige, gepackte BCD-Darstellung um. Beispiel: mov ah,17 ;gepackte BCD-Ziffer sub ahh,6 ; " " das ;gepackte Dezimaldifferenz Zeitbedarf: 4 Takte ---------------------------- Zurück zur Auflistung Befehl: DEC Quelle (DECrement) Subtrahiere den Wert 1 vom Quelloperanden Flags: O!,D*,I*,T*,S!,Z!,A!,P!,C* Beschreibung: Quelle = Quelle - 1 Beispiel: mov ah,9 ;AH = 9 dec ah ;AH = 8 dec ah ;AH = 7 Zeitbedarf: 2 Takte bei DEC Reg 15 Takte bei DEC Mem ---------------------------- Zurück zur Auflistung Befehl: DIV Quelle (DIVision) Division ohne Vorzeichen Flags: O?,D*,I*,T*,S?,Z?,A?,P?,C? Beschreibung: Der DIV-Befehl dividiert das AX-Register bzw. das Registerpaar DX:AX durch den Quelloperanden Divident / Divisor = Quotient Rest AX (16 Bit) / Operand(8 Bit)= AL AH DX:AX (32 Bit) / Operand(16Bit)= AX DX Beispiel: ;Byte-Division mov ax,330 ;AX = Divident mov bh,12 ;BH = Divisor (Byte) div bh ;AX / Byte = AL(Quotient) DX(Rest) ;Wort-Division xor dx:dx ;High-Teil 32-Bit-Wert löschen mov ax,30445 ;AX = Divident (Low-Teil 32-Bit-Wert) mox dx,330 ;DX = Divisor (Wort) div dx ;DX:AX / Wort = AX(Quotient) DX(Rest) Zeitbedarf: 85 Takte bei DIV Reg (16-Bit) 150 Takte bei DIV Reg (32-Bit) 90 Takte bei DIV Mem (16-Bit) 155 Takte bei DIV Mem (32-Bit) ---------------------------- Zurück zur Auflistung Befehl: ESC Koprozessorbefehl,Operand (ESCape) Speicherzugriff Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: ESC sendet einen Befehl an den Koprozessor. Der erste Operand ist eine Konstante, die den Befehl an den Coporzessor enthält. Der zweite Operand ist ein Register oder ein Speicheroperand, der den Operanden zum Coprozessorbefehl darstellt. Beispiel: ESC Opcode,al ;Opcode enthält einen Coprozessorbefehl ;AL wird als Parameter zum Opcode mit ;übergeben Zeitbedarf: 10 Takte ---------------------------- Zurück zur Auflistung Befehl: HLT (HaLT) Prozessor anhalten Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: Der HLT-Befehl veranlaßt den Prozessor, in einen Wartezustand zu gehen. Dieser Zustand kann durch den RESET-Befehl oder durch einen Interrupt wieder aufgehoben werden. Beispiel: ;Wir warten auf einen Tastendruck hlt ;warte auf einen Interrupt mov ah,1 ;Funktion zum Prüfen, ob Zeichen int 16h ;im Tastaturpuffer vorhanden Zeitbedarf: 2 Takte ---------------------------- Zurück zur Auflistung Befehl: IDIV Quelle (Integer DIVision) Division mit Vorzeichen Flags: O?,D*,I*,T*,S?,Z?,A?,P?,C? Beschreibung: Der IDIV-Befehl dividiert das AX-Register bzw. das Registerpaar DX:AX durch den Quelloperanden, unter Berücksichtigung des Vorzeichens. Divident / Divisor = Quotient Rest AX (16 Bit) / Operand(8 Bit)= AL AH AX:DX (32 Bit) / Operand(16Bit)= AX DX Unter Berücksichtigung des Vorzeichens: (+) / (+) = (+) (+) (-) / (+) = (-) (-) (+) / (-) = (-) (+) (-) / (-) = (-) (-) Beispiel: ;Byte-Division mov ax,-330 ;AX = Divident (-) mov bh,12 ;BH = Divisor (Byte) (+) idiv bh ;AX(-) / Byte (+) = AL (Quotient) (+) ;AH (Rest) (-) mov ax,-233 ;AX = Divident mov bh,-14 ;BH = Divisor (Byte) (-) ;AX (-) / Byte (-) = AL (Quotient) (-) ;AH (Rest) ;Wort-Division xor dx,dx ;High - Teil 32-Bit-Wert löschen (+) mov ax,30445 ;AX = Dividend (Low-Teil 32-Bit-Wert) (+) mov dx,300 ;DX = Divisor (Wort) (-) ;DX:AX / Wort = AX (Quotient) (-) ;DX(Rest) (+) Zeitbedarf: 105 Takte bei IDIV Reg (16 Bit) 170 Takte bei IDIV Reg (32 Bit) 110 Takte bei IDIV Mem (16 Bit) 180 Takte bei IDIV Mem (32 Bit) ---------------------------- Zurück zur Auflistung Befehl: IMUL Quelle (Integer MULtiply) Multiplikation mir Vorzeichen Flags: O!,D*,I*,T*,S?,Z?,A?,P?,C! Beschreibung: Der Befehl IMUL multipliziert den angegebenen Quelloperanden mit dem AL-Register (Quelle = Byte) oder mit dem AX-Register (Quelle = Wort). Das Ergebnis wird bei einer Byte-Multiplikation im AX-Register abgelegt, bei einer Wort-Multiplikation wird das Registerpaar DX:AX verwendet. Multiplikant * Multiplikator = Ergebnis AL (8 Bit) * Operand(8 Bit) = AX (16 Bit) AX(16 Bit) * Operand(16Bit) = DX:AX (32 Bit) Unter Berücksichtigung des Vorzeichens: (-) * (-) = (+) (+) * (-) = (-) (-) * (+) = (-) (+) * (+) = (+) Beispiel: ;Byte Multiplikation mit Vorzeichen mov al,35 ;Multiplikand (Byte) mov bl,-2 ;Multiplikator (Byte) imul bl ;AX (Wort) = AL (Byte) * BL (Byte) = -70 ;Wort Multiplikation mit Vorzeichen mov ax,-360 ;Multiplikand (Wort) mov bx,-45 ;Multiplikator (Wort) imul bx ;DX:AX (Doppelwort) = AX (Wort) * BX ;(Wort) = +16200 Zeitbedarf: 90 Takte bei IMUL Reg (8 Bit) 135 Takte bei IMUL Reg (16 Bit) 100 Takte bei IMUL Mem (8 Bit) 145 Takte bei IMUL Mem (16 Bit) ---------------------------- Zurück zur Auflistung Befehl: IN AX-/AL-Register,Quelle (INput byte and word) Einlesen eines Bytes oder Wortes von einem Eingabeport Flags: O!,D*,I*,T*,S?,Z?,A?,P?,C! Beschreibung: Der IN-Befehl transportiert ein Byte oder Wort vom Quelloperanden, der den E/A-Port angibt, in den Akkumulator, der das eingelesene Byte oder Wort aufnimmt. Beispiel: ;Der Tastaturpuffer hat die Portadresse 60h in al,60h ;lese ein Byte vom E/A-Port mit der Adresse ;60h ;(Tastaturpuffer) in das AL-Register Zeitbedarf: 10 Takte ---------------------------- Zurück zur Auflistung Befehl: INC Quelle (INCrement) Addiere den Wert 1 zum Quelloperanden Flags: O!,D*,I*,T*,S!,Z!,A!,P!,C* Beschreibung: Quelle = Quelle + 1 Beispiel: mov ah,7 ;AH = 7 inc ah ;AH = 8 inc ah ;AH = 9 Zeitbedarf: 3 Takte bei INC Reg 15 Takte bei INC Mem ---------------------------- Zurück zur Auflistung Befehl: INT Interrupt (INTerrupt) Unterbreche durch einen Interrupt Flags: O*,D*,I0,T0,S*,Z*,A*,P*,C* Beschreibung: Der INT-Befehl bewirkt die Ausführung eines Softwareinterrupts. Beispiel: ;Freie Speicherkapazität der Festplatte ermitteln über ;INT 21h ;Eingabe: AH = 36h ; DL = LW = 0 = aktuelles Laufwerk ; 1 = Laufwerk A ; 2 = Laufwerk B usw. ;Ausgabe: AX = 0FFFFh = Fehler sonst ; AX = Anzahl der Sektoren pro Cluster ; BX = Anzahl der freien Cluster ; CX = Anzahl der Bytes pro Cluster ; DX = Anzahl der Cluster gesamt xor dl,dl ;überprüfe die Speicherkapazität des ;aktuellen Lw mov ah,36h ;Funktion Plattenkapazität ermitteln int 21h ;Funktion (Intrerrupt) aufrufen cmp ax,0FFFFh ;Fehler? je Fehler ;ja - springe in zum Label Fehler: ;Freien Speicherplatz ermitteln mul cx ;freier Speicher in Bytes = Anzahl ;Sektoren pro mul bx ;Cluster * Anzahl Bytes pro Sektor * Anzahl ;freie Cluster -> AX = AX * CX * BX Zeitbedarf: 51 Takte ---------------------------- Zurück zur Auflistung Befehl: INTO (INTerrupt if Overflow) Löse einen Interrupt aus, wenn das überlauf-Flag gesetzt ist) Flags: O*,D*,I0,T0,S*,Z*,A*,P*,C* Beschreibung: INTO erzeugt den Softwareinterrupt INT 4 bei Auftreten eines überlaufs (OF = 1). Der Interrupt 4 ist unter DOS nicht belegt und muß vorher durch den Programmierer auf eine entsprechende Routine gesetzt werden. Beispiel: add ax,Wort_Var into ;Wenn der Wertebereich im AX-Register ;überschritten wird ;(AX > 65535) löse den Softwareinterrupt INT 4 aus Zeitbedarf: 53 Takte, falls der Interrupt ausgeführt wird 4 Takte, wenn der Interrupt nicht ausgeführt wird ---------------------------- Zurück zur Auflistung Befehl: IRET (Interrupt RETurn) Rückkehr aus einer Interruptroutine Flags: O!,D!,I!,T!,S!,Z!,A!,P!,C! Beschreibung: IRET kehrt zu dem Befehl hinter einer selbstgeschriebenen Interrupt-Anweisung zurück. Dazu werden das Codesegment, der IP und das Statusregister vom Stack genommen. Beispiel: INT_4 PROC FAR ; iret ;Zurück zum Aufrufer INT_4 ENDP Zeitbedarf: 24 Takte ---------------------------- Zurück zur Auflistung Befehl: JMP Ziel (JuMP) Unbedingter Sprung zur Zieladresse Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: Der JMP-Befehl bewirkt einen Sprung auf eine Adresse im Programm, die mit dem Zieloperanden angegeben wird. Beispiel: ; . jmp Ziel ;springe zu dem Label Ziel: ; . Ziel: ; . Zeitbedarf: 15 Takte ---------------------------- Zurück zur Auflistung Befehl: Jxxx Adr (Jump on Condition) Bedingter Sprung zur Zieladresse Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Die bedingten Sprünge des 8086-Prozessors Befehl: Sprung wenn... Jump if ... Geprüfte Statusflags: JA/JNBE größer / nicht-kleiner-gleich CF = 0 und ZF = 0 above / not-below-equal JAE/JNB größer-gleich / nicht-kleiner CF = 0 above-equal / not-below JB/JNAE kleiner / nicht-größer-gleich CF = 1 below / not-above-equal JBE/JNA kleiner-gleich / nicht-größer CF = 1 oder ZF = 1 below-equal / not-equal JE/JZ gleich / null ZF = 1 equal / zero JG/JNLE größer / nicht-kleiner-gleich ZF = 0 greater / not-less-equal JGE/JNL größer-gleich / nicht-kleiner SF gleich OF greater-equal / not-less JL/JNGE kleiner / nicht-größer-gleich SF ungleich OF less / not-greater-equal JLE/JNG kleiner-gleich / nicht-größer ZF = 1 less-equal / not-greater JNE/JNZ nicht-gleich / nicht-null ZF = 0 not-equal / not-zero JC Carry Flag (CF) gesetzt CF = 1 Carry JNC Carry Flag (CF) nicht gesetzt CF = 0 not-Carry JNP/JPO keine-Parität / Parität ungerade PF = 0 not-Parity / Parity-odd JNO kein überlauf OF = 0 not-Overflow JNS kein Vorzeichen (positiv) SF = 0 not-Sign JO überlauf OF = 1 Overflow JP/JPE Parität / Parität-gerade PF = 1 Parity / Parity-even Beschreibung: Jede der Vorgestellten Sprunganweisungen testet die Flags im Statusregister und führt einen Sprung nach Ziel aus, wenn die angegebene Bedingung erfüllt ist. Beispiel: cmp ax,bx ;vergleiche die Inhalte von AX und BX je Gleich ;springe wenn AX = BX zu Gleich: jg Groesser ;springe wenn AX > BX zu Groesser: jl Kleiner ;springe wenn AX < BX zu Kleiner: Zeitbedarf: 16 Takte, wenn der Sprung ausgeführt wird 4 Takte, wenn nicht ---------------------------- Zurück zur Auflistung Befehl: LAHF (Load AH from Flags) Lade das Low-Byte des Statusregisters in das AH-Register Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: LAHF transpoertiert die niederwertigen 8 Bits aus dem Statusregister in das AH-Register. Beispiel: ;Bit 7 6 5 4 3 2 1 0 lahf ;AH= SF ZF ? AF ? PF ? CF Zeitbedarf: 4 Takte ---------------------------- Zurück zur Auflistung Befehl: LDS Ziel,Quelle (Load Data Segment register) Lade Datensegment und ein Register Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: Der Befehl LDS überträgt die Segmentadresse des Quelloperanden in das Datensegment und die Offsetadresse des Quelloperanden in den Zieloperanden. Beispiel: lds si,String ;Segment- und Offsetadresse gleichzeitig ;laden ;String wird jetzt durch das Registerpaar ;DS:SI adressiert Zeitbedarf: 16 Takte ---------------------------- Zurück zur Auflistung Befehl: LEA Ziel,Quelle (Load Effective Address) Lade effektive Adresse Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: LEA berechnet und überträgt den Offset (effektife Adresse) des Quelloperanden in den Zieloperanden. Beispiel: lea bx,Tabelle ;Der BX-Register zeigt auf den Anfang ;von Tabelle Zeitbedarf: 2 Takte ---------------------------- Zurück zur Auflistung Befehl: LES Ziel,Quelle (Load ES-register) Lade Extrasegment und ein Register Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: Der Befehl LES überträgt die Segmentadresse des Quelloperanden in das Extrasegment und die Offsetadresse des Quelloperanden in den Zieloperanden. Beispiel: les si,String ;Segment. und Offsetadresse ;gleichzeitig laden ;String wird jetzt durch das ;Registerpaar ES:SI adressiert Zeitbedarf: 16 Takte ---------------------------- Zurück zur Auflistung Befehl: LOCK (LOCK) Bussperre Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: LOCK bewirkt, daß der Bus für die Dauer des nächsten Befehls gesperrt bleibt. Der Befehl dient in einer Multiprozessor-Umgebung zur Synchronisation des Zugriffs mehrerer Prozessoren auf den Systembus. Beispiel: lock and al,ah ;für diesen Befehl bleibt der Bus gesperrt Zeitbedarf: 2 Takte ---------------------------- Zurück zur Auflistung Befehl: LODS (LOaD String) LOADSB (Byte) LOADSW (Word) Lade ein Byte oder ein Wort eines Stringelementd Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: Laden eines Stringelements in das AL- (Byte) oder AX-Register (Wort). Der String wird über das Registerpaar DS:SI adressiert. Beispiel: lea si,String ;SI-Register zeigt auf den Anfang von ;String lodsb ;hole ein Byte aus String in das ;AL-Register lodsw ;hole ein Wort aus String in das ;AX-Register Zeitbedarf: 12 Takte ---------------------------- Zurück zur Auflistung Befehl: LOOP Adr (LOOP until count complete) Springe zur Adresse, solange das CX-Register nicht null Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: Der LOOP-Befehl subtrahiert vom CX-Register den Wert 1 und überprüft anschließend das CX-Register auf null. Ist das CX-Register nicht null, wird zu der angegebenen Adresse verzweigt, ist der Wert null, wird mit dem nächsten Befehl nach LOOP fortgeführt. Beispiel: ; . mov cx,10 ;CX ist der Schleifenzähler Schleife: ; loop Schleife ;Befehlssequenz 10 * ausführen Zeitbedarf: 17 Takte, wenn die Verzweigung ausgeführt wird 5 Takte, wenn nicht ---------------------------- Zurück zur Auflistung Befehl: LOOPE/LOOPZ Adr (LOOP if Equal/LOOP if Zero) Springe zu der Adresse, solange das CX-Register nicht null ist und solange das Zero-Flag gesetzt ist Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: LOOPE und LOOPZ arbeiten wie der LOOP-Befehl, mit dem Zusatz, daß zu der angegebenen Adresse nur dann verzweigt wird, wenn das Zero-Flag gesetzt ist (ZF = 1). Die Schleife wird also verlassen, wenn CX = 0 oder ZF = 0 ist. Beispiel: ;Suche in einer Tabelle ein Zeichen ungleich "A". ;Beende die Suche, wenn ein Zeichen ungleich "A" ;gefunden wird oder das Ende der Tabelle erreicht wird. mov cx,Laenge ;CX = Länge der Tabelle mov bx,-1 ;BX = Index Schleife: inc bx ;ein Element der Tab weiter cmp Tab[bx],"A" ;vergleiche auf "A" loope Schleife ;wenn gleich - springe ;zu Schleife: Zeitbedarf: 18 Takte, wenn Verzweigung ausgeführt wird 6 Takte, wenn nicht ---------------------------- Zurück zur Auflistung Befehl: LOOPNE/LOOPNZ Adr (LOOP if Not Equal/LOOP if Not Zero) Springe zu der Adresse, solange das CX-Register nicht null ist und solange das Zero-Flag nicht gesetzt ist Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: LOOPNE und LOOPNZ arbeiten wie der LOOP-Befehl, mit dem Zusatz, daß zu der angegebenen Adresse nur dann verzweigt wird, wenn das Zero-Flag nicht gesetzt ist. Die Schleife wird also verlassen, wenn CX = 0 oder ZF = 1 ist. Beispiel: ;Suche in einer Tabelle das Zeichen "*". ;Beende die Suche, wenn das Zeichen gefunden wird oder ;das Ende der Tabelle erreicht wird. mov cx,Laenge ;CX = Länge der Tabelle mov bx,-1 ;BX = Index Schleife: inc bx ;ein Element der Tab weiter cmp Tab[bx],"*" ;vergleiche auf "*" loopne Schleife ;wenn nicht gleich - ;oder ein Ende ;der Tabelle - springe zu ;Schleife: Zeitbedarf: 19 Takte, wenn Verzweigung ausgeführt wird 5 Takte, wenn nicht ---------------------------- Zurück zur Auflistung Befehl: MOV Ziel,Quelle (MOVe) übertrage/Kopiere Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: Der MOV-Befehl kopiert den Inhalt des Quelloperanden in den Zieloperanden. Beide Operanden müssen vom gleichen Typ sein (Byte,Byte / Word,Word). Als Zieloperand kann jedes Register oder eine Speichervariable angegeben werden. Der Quelloperand kann zusätzlich aus einem Direktwert bestehen. Beispiel: mov ax,2000 ;AX = 2000 mov ch,250 ;CH = 250 mov ax,bx ;AX = BX mov cx,Laenge ;CX = Laenge Zeitbedarf: 2 Takte bei MOV Reg,Reg (8 Bit/16 Bit) 4 Takte bei MOV Reg,Wert (8 Bit/16 Bit) 8 Takte bei MOV Reg,Mem (8 Bit/16 Bit) 9 Takte bei MOV Mem,Reg (8 Bit/16 Bit) 10 Takte bei MOV Mem,Wert (8 Bit/16 Bit) ---------------------------- Zurück zur Auflistung Befehl: MOVS Ziel,Quelle (MOVe String or Word) MOVSB (Byte) MOVSW (Word) Stringelement übertragen Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: MOVS überträgt ein Element einer Zeichenkette, welches durch den Quelloperanden (DS:SI) definiert ist, in der Zieloperanden (ES:DI). MOVS faßt somit die beiden Befehle LODS und STOS zusammen. Nach jeder übertragung werden die Segmentregister SI und DI, je nach gesetztem Direction-Flag um den Wert der übertragenen Größe erhöht oder gesenkt. Beispiel: ;Kopieren einer Zeichenkette in eine andere. . cld ;Zeichenkette wird von links nach rechts ;verarbeitet lea si,Quelle ;was kopiert wird lds di,Ziel ;wohin wird kopiert mov cx,Laenge ;Länge von Quelle rep movsb ;Ziel (ES:DI) <-- 18="" 20="" 100="" byte-weise="" -="" quelle="" zeitbedarf:="" takte="" ----------------------------="" befehl:="" mul="" multiply="" vorzeichenlose="" multiplikation="" flags:="" beschreibung:="" multipliziert="" den="" quelloperanden="" mit="" dem="" oder="" ax-register="" bei="" einer="" wort-multiplikation.="" multplikant="" multiplikator="Ergebnis" al="100" ax="" beispiel:="" byte-multiplikation="" mov="" bh="Byte"> AX = AL * BH sorry guys, this section was screwed up.... SYSTEM ERROR ;Byte-mit-Wort-Multiplikation xor ah,ah ;AH = 0 mov al,Summe ;AL = Summe mov bx,500 ;BX = 500 mul bx ;BX = Wort -> DX:AX = AX * BX ;DX = höherwertiger Teil des Ergebnisses ;AX = niederwertiger Teil des Ergebnisses Zeitbedarf: 75 Takte bei MUL Reg (8 Bit) 125 Takte bei MUL Reg (16 Bit) ---------------------------- Zurück zur Auflistung Befehl: NEG Operand (NEGate) Negieren [2er-Komplement bilden] Flags: O!,D*,I*,T*,S!,Z!,A!,P!,C! Beschreibung: NEG bildet das Zweierkomplement vom Operanden. Beispiel: mov ah,00001100b ;AH = 0000 1100 binär = 12 dezimal neg ah ;AH = 1111 0100 binär = -12 dezimal Zeitbedarf: 3 Takte bei NEG Reg 16 Takte bei NEG Mem ---------------------------- Zurück zur Auflistung Befehl: NOP (No OPerantion) Keine Operation Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: NOP führt keine Operation durch. Dieser Befehl dient dem Assembler dazu, eine Warteschleife aufzubauen. Beispiel: ;Warte 6 Maschinentakte nop nop Zeitbedarf: 3 Takte ---------------------------- Zurück zur Auflistung Befehl: NOT Operand (NOT) Logisches Nicht Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: NOT bildet von dem angegebenen Operanden die logische Negation, das heißt, alle Bits des Operanden gehen von Eins auf Null und umgekehrt. op1 NOT op1 0 1 1 0 Beispiel: mov al,00001111b ;AL = 0000 1111 binär not al ;AL = 1111 0000 binär Zeitbedarf: 3 Takte bei NOT Reg 16 Takte bei NOT Mem ---------------------------- Zurück zur Auflistung Befehl: OR Ziel,Quelle (OR) Logisches Oder Flags: O0,D*,I*,T*,S!,Z!,A?,P!,C0 Beschreibung: OR verknüpft den Quelloperanden bitweise mit mit dem Zieloperanden nach der logischen Oder-Regel op1 op2 op1 OR op2 0 0 0 0 1 1 1 0 1 1 1 1 Beispiel: mov ah,10101101b ;AH = 1010 1101 binär mov al,01100111b ;AL = 0110 0111 binär or al,ah ;AL = 1110 1111 binär Zeitbedarf: 3 Takte bei OR Reg,Reg 4 Takte bei OR Reg,Wert 9 Takte bei OR Reg,Mem 16 Takte bei OR Mem,Reg ---------------------------- Zurück zur Auflistung Befehl: OUT Port-Adresse,AX-/AL-Register (OUTput) Ausgabe eines Bytes oder Wortes an eine Portadresse Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: Der OUT-Befehl übergibt ein Byte im AL-Register oder ein Wort im AX-Register an eine Portadresse. Liegt die Portadresse im Bereich zwischen 0 und 255, kann sie als Direktwert angegeben werden. Ist die Portadresse größer 255, muß der Wert im DX-Register angegeben werden. Beispiel: ;Schreibe ein Byte in den Tastaturpuffer ;Portadresse der Tastatur ist 60h mov al,"?" ;AL = "?" out 60h,al ;schreibe das Zeichen "?" in den ;Tastaturpuffer Zeitbedarf: 10 Takte ---------------------------- Zurück zur Auflistung Befehl: POP Ziel (POP word off stack) übertrage obersten Stack-Inhalt Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: Mit diesem Befehl werden zwei Bytes von der Spitze des Stacks in den Zieloperanden übertragen . Das Offsetregister des Stacks, der Stackpointer, wird anschließend um den Wert 2 erhöht. Beispiel: push ax ;Inhalt des AX-Registers auf den Stack speichern pop ax ;Inhalt des obersten Stack-EIntrags nach AX ;kopieren Zeitbedarf: 8 Takte bei POP Reg 16 Takte bei POP Mem ---------------------------- Zurück zur Auflistung Befehl: POPF (POP Flags off stack) übertrage den obersten Stack-Inhalt in das Statusregister Flags: O!,D!,I!,T!,S!,Z!,A!,P!,C! Beschreibung: Mit diesem Befehl werden zwei Bytes von der Spitze des Stacks in das Statusregister übertragen. Das Offsetregister des Stacks, der Stackpointer wird um den Wert 2 erhöht. Beispiel: pushf ;Inhalt des Statusregisters auf den Stack ;speichern ; popf ;alten Zustand des Statusregisters ;wiederherstellen Zeitbedarf: 8 Takte ---------------------------- Zurück zur Auflistung Befehl: PUSH Quelle (PUSH word to stack) übertrage den Quelloperanden auf den Stack Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: PUSH subtrahiert vom Stackpointer den Wert 2 und reserviert somit einen freien Platz(Wort) auf dem Stack. Danach wird der Quelloperand, der eine Wort-Größe darstellen muß, auf dem Stack kopiert. Beispiel: push ax ;Inhalt AX-Register zwischenspeichern push wort_var ;Variable wort_var zwischenspeichern Zeitbedarf: 11 Takte bei PUSH Reg 16 Takte bei PUSH Mem ---------------------------- Zurück zur Auflistung Befehl: PUSHF (PUSH Flags to stack) übertrage das Statusregister auf den Stack Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: PUSHF überträgt das Statusregister auf den Stack. Beispiel: pushf ;rette den Inhalt des Statusregisters popf ;alten Inhalt des Statusregisters ;wiederherstellen Zeitbedarf: 10 Takte ---------------------------- Zurück zur Auflistung Befehl: RCL Ziel,n (Rotate through Carry Left) Rotiere nach links durch das Carry Flag Flags: O!,D*,I*,T*,S*,Z*,A*,P*,C! Beschreibung: Der RCL-Befehl rotiert die einzelnen Bits des Zieloperanden n-mal nach links. Das höherwertige Bit des Zieloperanden wird im Carry-Flag abgelegt. Vor dieser Operation wird der aktuelle Inhalt des Carry-Flags in das niederwertige Bit des Zieloperanden geschoben. Soll mehr als ein Bit des Zieloperanden verschoben werden, muß der Wert über das CL-Register angegeben werden. Beispiel: clc ;CF = 0 mov al,01101001b ;AL = 0110 1001 binär rcl al,1 ;AL = 1101 0010 binär CF = 0 mov cl,2 ;CL = 2 rcl al,cl ;AL = 0100 1001 binär CF = 1 Zeitbedarf: 2 Takte bei RCL Reg,1 8 + 4 * n Takte bei RCL Reg,CL 15 Takte bei RCL Mem,1 20 + 4 * n Takte bei RCL Mem,CL ---------------------------- Zurück zur Auflistung Befehl: RCR Ziel,n (Rotate through Carry Right) Rotiere nach rechts durch das Carry Flag Flags: O!,D*,I*,T*,S*,Z*,A*,P*,C! Beschreibung: Der RCL-Befehl rotiert die einzelnen Bits des Zieloperanden n-mal nach rechts. Das höherwertige Bit des Zieloperanden wird im Carry-Flag abgelegt. Vor dieser Operation wird der aktuelle Inhalt des Carry-Flags ín das höherwertige Bit des Zieloperanden geschoben. Soll mehr als ein Bit des Zieloperanden verschoben werden, muß der Wert über das CL-Register angegeben werden. clc ;CF = 0 mov al,01101001b ;AL = 0110 1001 binär rcr al,1 ;AL = 0011 0100 binär CF = 1 mov cl,2 ;CL = 2 rcr al,cl ;AL = 0100 1101 binär CF = 0 Zeitbedarf: 2 Takte bei RCR Reg,1 8 + 4 * n Takte bei RCR Reg,CL 15 Takte bei RCR Mem,1 20 + 4 * n Takte bei RCR Mem,CL ---------------------------- Zurück zur Auflistung Befehl: REP (REPeat string operation) REPE/REPNE REPZ/REPNZ Wiederhole Stringoperation Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: REP ist ein Präfix vor einem Stringbefehl und wiederholt diesen, solange das CX-Register nicht null ist. Bei jedem Durchlauf wird das CX-Register um den Wert 1 gesenkt. Zusätzlich gibt es zum REP-Befehl verschiedene Varianten: REPE/REPZ ;Wiederhole bis CX = 0 und ZF = 1 REPNE/REPNZ ;Wiederhole bis CX = 0 und ZF = 0 Beispiel: ;Füllen einer Tabelle mit Hilfe des Stringbefehls STOSB ;und der REP-Anweisung cld ;Stringverarbeitung aufsteigend les di,Zielstring ;STOSB überträgt den Inhalt des ;AL-Registers mov al," " ;in die durch ES:DI adressierte ;Speicherstelle mov cx,Laenge_Ziel ;Länge des Zleistrings nach CX rep stosb ;Füllen des Zielstrings mit Blank ;Suche nach einem Zeichen mit SCASB ind der REPNE-Anweisung cld ;Stringverarbeitung aufsteigend les di,Zielstring ;SCASB vergleicht die durch ES:DI ;adressierte mov al,"&" ;Speicherstelle mit dem ;AL-Register mov cx,Laenge_Ziel ;Länge des Zielstrings nach CX repne scasb ;vergleiche bis Ende Zielstring ;oder je Gefunden ;Zeichen gefunden Zeitbedarf: 2 Takte ---------------------------- Zurück zur Auflistung Befehl: RET (RETurn) Rücksprung aus einem Unterprogramm Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: Beim Aufruf eines Unterprogramms durch den CALL-Befehl wird der auf den CALL-Befehl folgende Befehl auf dem Stack zwischengespeichert. RET holt diese Adresse vom Stack zurück und setzt dadurch die Programmausführung nach dem CALL-Befehl fort. Beispiel: <1> . <2> call UP ;Aufruf des Unterprogramms UP <4> <3> . <4> UP PROC ;Anfang des Unterprogramms UP <5> . <6> <7> . <8> RET ;zurück zum Aufrufer <3> <9> UP ENDP Zeitbedarf: 8 Takte bei einem NEAR Unterprogramm 18 Takte bei einem FAR Unterprogramm ---------------------------- Zurück zur Auflistung Befehl: ROL Ziel,n (ROtate Left) Rotiere nach links Flags: O!,D*,I*,T*,S*,Z*,A*,P*,C! Beschreibung: ROL rotiert den Zieloperanden um n Bits nach links. Das höherwertige Bit wird in das Carry Flag und in das niederwertige Bit des Zieloperanden übertragen. Soll mehr als ein Bit nach links verschoben werden, muß der Wert im CL-Register angegeben werden. Beispiel: mov ah,01101101b ;AH = 0110 1101 binär rol ah,1 ;AH = 1101 1010 binär CF = 0 mov cl,2 ;CL = 2 rol ah,cl ;AH = 0110 1011 binär CF = 1 Zeitbedarf: 2 Takte bei ROL Reg,1 8 + 4 * n Takte bei ROL Reg,CL 15 Takte bei ROL Mem,1 20 + 4 * n Takte bei ROL Mem,CL ---------------------------- Zurück zur Auflistung Befehl: ROR Ziel,n (POtate Right) Rotiere nach rechts Flags: O,D,I,T,S,Z,A,P,C Beschreibung: ROL rotiert den Zieloperanden um n Bits nach rechts. Das niederwertige Bit wird in das Carry Flag und in das höherwertige Bit des Zieloperanden übertragen. Soll mehr als ein Bit nach links verschoben werden, muß der Wert im CL-Register angegeben werden. Beispiel: mov ah,01101101b ;AH = 0110 1101 binär ror ah,1 ;AH = 1011 0110 binär CF = 1 mov cl,2 ;CL = 2 ror ah,cl ;AH = 1010 1101 binär CF = 1 Zeitbedarf: 2 Takte bei ROR Reg,1 8 + 4 * n Takte bei ROR Reg,CL 15 Takte bei ROR Mem,1 20 + 4 * n Takte bei ROR Mem,CL ---------------------------- Zurück zur Auflistung Befehl: SAHF (Store AH into Flags) Kopiere den Inhalt des AH-Registers in das untere Byte des Statusregisters Flags: O*,D*,I*,T*,S!,Z!,A!,P!,C! Beschreibung: überträgt den Inhalt des AH-Registers in das niederwertige Byte des Statusregisters. Aus diese Weise können sie Statusflags SF, ZF, AF, PF,und CF nicht nur durch bedingte Sprungbefehle abgetestet werden. Beispiel: ;Löschen des SF,ZF,AF,PF und CF xor ah,ah ;AH = 0 sahf ;SF=ZF=AF=PF=CF=0 Zeitbedarf: 4 Takte ---------------------------- Zurück zur Auflistung Befehl: SAL Ziel,n (Shift Arithmetic Left) Verschiebe arithmetisch nach links Flags: O!,D*,I*,T*,S!,Z!,A?,P!,C! Beschreibung: SAL hat die gleiche Funktion wie SHL und bewirkt, daß der Zieloperand um n Bits nach links geschoben wird. Das höherwertige Bit des Zieloperanden wird beim Shiften in das Carry Flag übertragen. Das niederwertige Bit wird mit einer Null gefüllt. Soll mehr als ein Bit verschoben werden, muß der Wert im CL-Register angegeben werden. Beispiel: ;Das Verschieben des Zieloperanden um ein Bit nach links ;und das Auffüllen des niederwertigen Bits mit dem Wert ;Null bewirkt in der Dualarithmetik eine Multiplikation ;mit dem Wert 2 mov ah,20 ;AH = 20 sal ah,1 ;AH = 40 mov cl,2 ;CL = 2 sal ah,cl ;AH = 160 Zeitbedarf: 2 Takte bei SAL Reg,1 8 + 4 * n Takte bei SAL Reg,CL 15 Takte bei SAL Mem,1 20 + 4 * n Takte bei SAL Mem,CL ---------------------------- Zurück zur Auflistung Befehl: SAR Ziel,n (Shift Arithmetic Rigtht) Verschiebe arithmetisch nach rechts Flags: O!,D*,I*,T*,S!,Z!,A?,P!,C! Beschreibung: SAR bewirkt, daß der Zieloperand um n Bits nach rechts geschoben wird. Das niederwertige Bit des Zieloperanden wird beim Shiften in das Carry Flag übertragen. Das höherwertige Bit (Vorzeichen) wird dabei nicht mit Null aufgefüllt, sondern mit einer Kopie des Vorzeichens. Soll mehr als ein Bit nach rechts geschoben werden, muß der Wert im CL-Register angegeben werden. Beispiel: ;Das Verschieben des Zieloperanden um ein Bit nach ;rechts bewirkt in der Dualarithmetik eine Division ;durch den Wert 2. Da SAR das Vorzeichenbit nicht ;verändert, können vorzeichenbehaftete Operanden ;vorzeichengerecht dividiert werden. mov ah,-40 ;AH = -40 sar ah,1 ;AH = -20 mov cl,2 ;CL = 2 sar ah,cl ;AH = -5 Zeitbedarf: 2 Takte bei SAR Reg,1 8 + 4 * n Takte bei SAR Reg,CL 15 Takte bei SAR Mem,1 20 + 4 * n Takte bei SAR Mem,CL ---------------------------- Zurück zur Auflistung Befehl: SBB Ziel,Quelle (SuBtract with Borrow) Subtraktion mit übertrag Flags: O!,D*,I*,T*,S!,Z!,A!,P!,C! Beschreibung: SBB subtrahiert den Inhalt des Quelloperanden vom Inhalt des Zieloperanden unter Berücksichtigung des Carry Flags. Ist das Carry Flag gesetzt (CF = 1), wird dieses vom Zieloperanden subtrahiert. SBB wird hauptsächlich bei der Subtraktion von 32-Bit-Werten benutzt. Beispiel: ;Vom 32-Bit-Wert (DX:AX) einen 16-Bit-Wert (BX) ;subtrahieren sub ax,bx ;32-Bit-Low-Wert - 16-Bit-Wert sbb dx,0 ;übertrag berücksichtigen Zeitbedarf: 3 Takte bei SBB Reg,Reg 9 Takte bei SBB Reg,Mem 16 takte bei SBB Mem,Reg ---------------------------- Zurück zur Auflistung Befehl: SCAS (SCAn String) SCASB SCASW Vergleiche String [ES:DI] mit dem Akkumulator Flags: O!,D*,I*,T*,S!,Z!,A!,P!,C! Beschreibung: SCAS vergleicht einen String, der durch das Registerpaar ES:DI adressiert ist, mit dem Inhalt des AL-Registers (Byte) oder des AX-Registers (Wort). Beispiel: ;Suche in einer Zeichenkette das Zeichen "*" mov cx,Laenge_String ;Wiederhole CX mal für REPNE les di,Such_String ;dieser String wird durchsucht mov al,"*" ;Zeichen, nach dem gesucht witrd repne scasb ;suche bis Zeichen gefunden oder ;Ende String je Gefunden ;wenn Zeichen gefunden - springe ;zu Gefunden: Zeitbedarf: 15 Takte pro vergleich ---------------------------- Zurück zur Auflistung Befehl: SHL Ziel,n (Shift Arithmetic Left) Verschiebe arithmetisch nach links Flags: O!,D*,I*,T*,S!,Z!,A?,P!,C! Beschreibung: SAL hat die gleiche Funktion wie SAL und bewirkt, daß der Zieloperand um n Bits nach links geschoben wird. Das höherwertige Bit des Zieloperanden wird beim Shiften in das Carry Flag übertragen. Das niederwertige Bit wird mit einer Null gefüllt. Soll mehr als ein Bit verschoben werden, muß der Wert im CL-Register angegeben werden. Beispiel: ;Das Verschieben des Zieloperanden um ein Bit nach links ;und das Auffüllen des niederwertigen Bits mit dem Wert ;Null bewirkt in der Dualarithmetik eine Multiplikation ;mit dem Wert 2 mov ah,20 ;AH = 20 shl ah,1 ;AH = 40 mov cl,2 ;CL = 2 shl ah,cl ;AH = 160 Zeitbedarf: 2 Takte bei SHL Reg,1 8 + 4 * n Takte bei SHL Reg,CL 15 Takte bei SHL Mem,1 20 + 4 * n Takte bei SHL Mem,CL ---------------------------- Zurück zur Auflistung Befehl: SHR Ziel,n (SHift logical Right) Verschiebe logisch nach rechts Flags: O!,D*,I*,T*,S!,Z!,A?,P!,C! Beschreibung: SHR bewirkt, daß der Zieloperand um n Bits nach rechts geschoben wird. Das niederwertige Bit des Zieloperanden wird beim Shiften in das Carry Flag übertragen. Das höherwertige Bit wird mit einer Null aufgefüllt. Soll mehr als ein Bit nach rechts verschoben werden, muß der Wert im CL-Register angegeben werden. Beispiel: ;Das Verschieben des Zieloperanden um ein Bit nach ;rechts und das Auffüllen des höherwertigen Bits mit dem ;Wert Null bewirkt in der Dualarithmetik eine Division ;durch den Wert 2 mov ah,200 ;AH = 200 shr ah,1 ;AH = 100 mov cl,2 ;CL = 2 shr ah,cl ;AH = 25 Zeitbedarf: 2 Takte bei SHR Reg,1 8 + 4 * n Takte bei SHR Reg,CL 15 Takte bei SHR Mem,1 20 + 4 * n Takte bei SHR Mem,CL ---------------------------- Zurück zur Auflistung Befehl: STC (SeT Carry flag) Setze das Carry Flag auf Eins (CL = 1) Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C1 Beschreibung: STC setzt das Carry Flag auf Eins. Beispiel: clc ;CF = 0 stc ;CF = 1 Zeitbedarf: 2 Takte ---------------------------- Zurück zur Auflistung Befehl: STD (SeT Direction flag) Setze das Direction Flag auf Eins (DF = 1) Flags: O*,D1,I*,T*,S*,Z*,A*,P*,C* Beschreibung: STD setzt das Direction Flag auf Eins. Dadurch arbeiten alle Stringoperationen in Richtung absteigender Adressen, also von rechts nach links. Beispiel: . std ;Alle Stringoperationen arbeiten von rechts ;nach links stosb ;Stringoperation . cld ;Alle Stringoperationen arbeiten von links ;nach rechts movsb Zeitbedarf: 2 Takte ---------------------------- Zurück zur Auflistung Befehl: STI (SeT Interrupt flag) Setze Interrupt Flag auf Eins (IF = 1) Flags: O*,D*,I1,T*,S*,Z*,A*,P*,C* Beschreibung: STI setzt das Interrupt Flag aud Eins. Damit werden externe Interrupts, die mit CLS gesperrt wurde, wieder zugelassen. Beispiel: cli ;extern maskierbare Interrupts sperren ;(erst mal Ruhe) ; sti ;extern maskierbare Interrupts wieder ;zulassen Zeitbedarf: 2 Takte ---------------------------- Zurück zur Auflistung Befehl: STOS (STOre String byte or Word) STOSB STOSW übertrage den Inhalt des Akkumulators in einen String [ES:DI] Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: STOS übertragt den Inhalt des AL-Registers bei einer Byte-Verarbeitung bzw. den Inhalt des AX-Registers bei einer Wort-Verarbeitung in einen durch das Registerpaar ES:DI adressierten Speicherbereich. Beispiel: ;Füllen einer Tabelle mit Hilfe ;des Stringbefehls STOSB ;und REP cld ;von links nach rechts les di,ZielTab ;STOSB überträgt den Inhalt des ;AL-Registers mov al,0 ;in die durch ES.DI adressierte ;Speicherstelle mov cx,Laenge_Ziel ;Länge der Tabelle nach CX rep stosb ;Füllen der Tabelle mit dem Wert ;Null Zeitbedarf: 11 Takte ---------------------------- Zurück zur Auflistung Befehl: SUB Ziel,Quelle (SUBtract) Subtrahiere Flags: O!,D*,I*,T*,S!,Z!,A!,P!,C! Beschreibung: Der Inhalt des Quelloperanden wird vom Inhalt des Zieloperanden subtrahiert und das Ergebnis im Zieloperanden abgespeichert. Beispiel: mov ax,2000 ;AX = 2000 sub ax,500 ;AX = 1500 mov ah,40 ;AH = 40 mov al,10 ;AL = 10 sub ah,al ;AH = 30 Zeitbedarf: 3 Takte bei SUB Reg,Reg 4 Takte bei SUB Reg,Wert 9 Takte bei SUB Reg,Mem 16 Takte bei SUB Mem,Reg 17 Takte bei SUB Mem,Wert ---------------------------- Zurück zur Auflistung Befehl: TEST Ziel,Quelle (TEST) Logischer Vergleich [Und-VErknüpfung] Flags: O0,D*,I*,T*,S!,Z!,A?,P!,C0 Beschreibung: TEST verknüpft den Zieloperanden bitweise mit dem Quelloperanden nach der Und-Verküpfung. Das Ergebnis des Vergleichs wird nicht abgespeichert sondern verändern nur das Statusregister. Beispiel: ;Ein vorzeichenbehafteter Byte-Wert soll auf :positiv oder negativ geprüft werden. ; ;Bit 7 6 5 4 3 2 1 0 ; 0 Vorzeichenbit (Bit 7) = 0 -> Positiv ; 1 Vorzeichenbit (Bit 7) = 1 -> Negativ ; TEST al,10000000b ;Bit 7 gesetzt je Negativ ;Ja - negativer Wert jmp positiv ;Nein - positiver Wert Zeitbedarf: ---------------------------- Zurück zur Auflistung Befehl: WAIT (Wait until not busy) Warte Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: Der Prozessor wird in einen Wartezustand versetzt, bis der Coprozessor einen ihm übertragenen Befehl abgearbeitet hat. Dazu wird in einem Abstand von 5 Takten die Eingangsleitung TEST überprüft, welche der Coprozessor nach der Ausführung des Befehls aktiviert. Dieser Befehl wird immer dann benötigt, wenn der Coprozessor langsamer getaktet ist als der Hauptprozessor (Synchronisation). Beispiel: ; wait ;warte so lange, bis der Befehl abgearbeitet wird Zeitbedarf: 3 + 5 * n Takte ---------------------------- Zurück zur Auflistung Befehl: XCHG Operand1,Operand2 (eXCHanGe) Vertausche Inhalt der Operanden Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: XCHG vertauscht den Inhalt der beiden Operanden. Beide Operanden müssen gleich groß sein, einer von ihnen muß ein Register sein. Beispiel: mov ah,40 ;AH = 40 mov dh,10 ;DH = 10 xchg ah,dh ;vertausche die Inhalte der beiden Operanden ;AH = 10 und DH = 40 Zeitbedarf: 4 Takte für XCHG Reg,Reg 17 Takte für XCHG Reg,Mem ---------------------------- Zurück zur Auflistung Befehl: XLAT (transLATe) XLATB Tabellenelement umschlüsseln Flags: O*,D*,I*,T*,S*,Z*,A*,P*,C* Beschreibung: XLAT transportiert ein Byte aus einer Tabelle, die über das BX-Register adressiert wird, in das AL-Register. Das AL-Register wird vor dem eigentlichen Befehlsaufruf XLAT als Index verwendet. Beispiel: . Tab db "ABCDEF" . lea bx,Tab ;BX = Offset von Tab xor al,al ;AL = 0 -> Index = Erstes Element von Tab xlatb ;AL = "A" mov al,3 ;AL = 3 -> Index = viertes Element von Tab xlat Tab ;AL = "D" Zeitbedarf: 11 Takte ---------------------------- Zurück zur Auflistung Befehl: XOR (eXclusive OR) Exklusives Oder Flags: O0,D*,I*,T*,S!,Z!,A?,P!,C0 Beschreibung: XOR verknüpft den Zieloperanden bitweise mit dem Quelloperanden nach der Exklusiv-Oder-Verknüpfung. Das Ergebnis wird im Zieloperanden abgelegt. op1 op2 XOR op2 0 0 0 0 1 1 1 0 1 1 1 0 Beispiel: xor ax,ax ;AX = 0 Zeitbedarf: 3 Takte bei XOR Reg,Reg 4 Takte bei XOR Reg,Wert 9 Takte bei XOR Reg,Mem 16 Takte bei XOR Mem,Reg 17 Takte bei XOR Mem,Wert ______________________________________________________________