Assembler (80x86 Prozessor)-Programmierung: Stringbefehle

Aus Wikibooks

Wechseln zu: Navigation, Suche


Nuvola apps bookcase.svg Assembler (80x86 Prozessor)-Programmierung


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


Wikibooks buchseite.svg Zurück zu Sprünge, Schleifen und Unterprogramme | One wikibook.svg Hoch zu Assembler (80x86 Prozessor)-Programmierung | Wikibooks buchseite.svg Vor zu Befehlsreferenz


Persönliche Werkzeuge