Assembler (80x86 Prozessor)-Programmierung: Stringbefehle
Aus Wikibooks
Inhaltsverzeichnis |
[Bearbeiten] Maschinensprache-Befehle zur Stringverarbeitung
Die CPU der 80x86 Familie besitzen spezielle Befehle, mit denen die Verarbeitung von Massendaten, z.B. von Zeichenketten, optimiert werden kann.
[Bearbeiten] Beispiel: Kopieren Byteweise ab Adresse SI nach DI
;
MOV CX,40 ; Zeichenanzahl
SCHL: MOV AL,[SI]
MOV [DI],AL
INC SI
INC DI
LOOP SCHL
In jedem Schleifendurchlauf muss der Prozessor die gleichen fünf Befehle immer neu lesen und decodieren. Ersetzt man obige Befehle durch
;
MOV CX,40 ; Zeichenanzahl
REP MOVSB
wird das Programm kürzer und läuft auch viel schneller.
Es gibt Übertragungsbefehle MOVSx,
LODSx, STOSx
Vergleichsbefehle SCASx (vergleicht String mit Wert)
CMPSx (vergleicht zwei Strings)
Wiederholungspräfixbefehle REP (wiederholen)
REPE oder REPZ (wiederholen solange Equivalent oder Zero)
REPNE (wiederholen solange nicht Equivalent)
REPNZ (wiederholen solange nicht Zero)
(für x muß B (Byte) oder W (Wort) eingesetzt werden)
Allgemeine Regeln:
In DS:SI muss die Quelladresse stehen
In ES:DI muss die Zieladresse stehen
In CX steht die Wiederholungsanzahl
Das Direction Flag muss einen Wert erhalten: Entweder mit CLD löschen (DF=0) oder mit STD setzen.
[Bearbeiten] Beispiel: Das erste Leerzeichen in einem String finden
;
MOV CX,SIZE STRING ; Stringlänge
CLD ; Richtung
MOV AL,20H ; Quelloperand: Leerzeichen
MOV DI,SEG STRING ; Segmentadresse
MOV ES,DI
MOV DI,OFFSET STRING ; Offsetadresse
REPNE SCASB ; Wiederholen solange ungleich AL
JNZ xxx ; bis Ende durchsucht und kein Leerzeichen gefunden
JZ yyy ; bis Ende durchsucht und Leerzeichen gefunden
[Bearbeiten] Beispiel: Zwei Strings auf Gleichheit überprüfen
;
CLD ; In Richtung steigender Adressen vergleichen
MOV CX,SIZE STRING1 ; Stringlänge
MOV SI,SEG STRING1 ; Segmentadresse
MOV DS,SI
MOV SI,OFFSET STRING1 ; Offsetadresse
MOV DI,SEG STRING2 ; Segmentadresse
MOV ES,DI
MOV DI,OFFSET STRING2 ; Offsetadresse
REPE CMPSB ; Wiederholen solange ungleich AL
JNZ xxx ; Strings sind ungleich
JZ yyy ; Strings sind gleich