Zum Inhalt springen

Maschinensprache i8086/ Stringbefehle

Aus Wikibooks

Theorie:  EinleitungMaschinenspracheAssemblerZahlensystemeRAM-AdressenBWSDebugCPU-RegisterEinfache BefehleStringbefehleInterruptsI/O-Ports
Versuch:  BWS1BWS2Hallo WeltBootsektorMBR
Nützlich: BefehlslistePAUSEFilter
Analyse:  Bootloader

Maschinensprache-Befehle zur Stringverarbeitung

[Bearbeiten]

Die CPU der 80x86 Familie besitzen spezielle Befehle, mit denen die Verarbeitung von Massendaten, z.B. von Zeichenketten, optimiert werden kann.

Beispiel: Kopieren von 40h Byte ab Adresse SI nach DI

[Bearbeiten]
       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.

Anmerkung: Wenn man ein kleines .com Programm schreibt, braucht man sich um die Segmentregister nicht zu kümmern. Das Betriebssystem setzt vor dem Programmstart alle Segmentregister einheitlich: CS = DS = ES = SS.

Beispiel: Das erste Leerzeichen in einem String finden

[Bearbeiten]
      CLD                     ; In Richtung steigender Adressen vergleichen
      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

Beispiel: Zwei Strings auf Gleichheit überprüfen

[Bearbeiten]
      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 [DI] ungleich AL ist

      JNZ   xxx                ; Strings sind ungleich
      JZ    yyy                ; Strings sind gleich