Montage - Saiten

In unseren vorherigen Beispielen haben wir bereits Zeichenfolgen mit variabler Länge verwendet. Die Zeichenfolgen variabler Länge können beliebig viele Zeichen enthalten. Im Allgemeinen geben wir die Länge der Zeichenfolge auf eine der beiden Arten an:

  • Zeichenfolgenlänge explizit speichern
  • Verwenden eines Sentinel-Zeichens

Wir können die Zeichenfolgenlänge explizit speichern, indem wir das Symbol $ location counter verwenden, das den aktuellen Wert des Standortzählers darstellt. Im folgenden Beispiel -

msg  db  'Hello, world!',0xa ;our dear string
len  equ  $ - msg            ;length of our dear string

$ zeigt auf das Byte nach dem letzten Zeichen der Zeichenfolgenvariablen msg . Deshalb,$-msggibt die Länge der Zeichenfolge an. Wir können auch schreiben

msg db 'Hello, world!',0xa ;our dear string
len equ 13                 ;length of our dear string

Alternativ können Sie Zeichenfolgen mit einem nachgestellten Sentinel-Zeichen speichern, um eine Zeichenfolge abzugrenzen, anstatt die Zeichenfolgenlänge explizit zu speichern. Das Sentinel-Zeichen sollte ein Sonderzeichen sein, das nicht in einer Zeichenfolge enthalten ist.

Zum Beispiel -

message DB 'I am loving it!', 0

String-Anweisungen

Jeder Zeichenfolgenbefehl kann einen Quelloperanden, einen Zieloperanden oder beides erfordern. Bei 32-Bit-Segmenten verwenden Zeichenfolgenbefehle ESI- und EDI-Register, um auf die Quell- bzw. Zieloperanden zu verweisen.

Für 16-Bit-Segmente werden jedoch die SI- und DI-Register verwendet, um auf die Quelle bzw. das Ziel zu zeigen.

Es gibt fünf grundlegende Anweisungen zum Verarbeiten von Zeichenfolgen. Sie sind -

  • MOVS - Diese Anweisung verschiebt 1 Byte, Word oder Doubleword von Daten vom Speicherort zu einem anderen.

  • LODS- Diese Anweisung wird aus dem Speicher geladen. Wenn der Operand ein Byte hat, wird er in das AL-Register geladen, wenn der Operand ein Wort ist, wird er in das AX-Register geladen und ein Doppelwort wird in das EAX-Register geladen.

  • STOS - Dieser Befehl speichert Daten aus dem Register (AL, AX oder EAX) im Speicher.

  • CMPS- Diese Anweisung vergleicht zwei Datenelemente im Speicher. Daten können eine Bytegröße, ein Wort oder ein Doppelwort haben.

  • SCAS - Diese Anweisung vergleicht den Inhalt eines Registers (AL, AX oder EAX) mit dem Inhalt eines Elements im Speicher.

Jeder der obigen Befehle hat eine Byte-, Wort- und Doppelwortversion, und Zeichenfolgenbefehle können unter Verwendung eines Wiederholungspräfixes wiederholt werden.

Diese Anweisungen verwenden das Registerpaar ES: DI und DS: SI, wobei DI- und SI-Register gültige Versatzadressen enthalten, die sich auf im Speicher gespeicherte Bytes beziehen. SI ist normalerweise mit DS (Datensegment) verbunden und DI ist immer mit ES (zusätzliches Segment) verbunden.

Die Register DS: SI (oder ESI) und ES: DI (oder EDI) zeigen auf die Quell- bzw. Zieloperanden. Es wird angenommen, dass sich der Quelloperand bei DS: SI (oder ESI) und der Zieloperand bei ES: DI (oder EDI) im Speicher befindet.

Für 16-Bit-Adressen werden die SI- und DI-Register verwendet, und für 32-Bit-Adressen werden die ESI- und EDI-Register verwendet.

Die folgende Tabelle enthält verschiedene Versionen von Zeichenfolgenanweisungen und den angenommenen Platz der Operanden.

Grundlegende Anweisung Operanden bei Byte-Betrieb Wortoperation Doppelwortoperation
MOVS ES: DI, DS: SI MOVSB MOVSW MOVSD
LODS AX, DS: SI LODSB LODSW LODSD
STOS ES: DI, AX STOSB STOSW STOSD
CMPS DS: SI, ES: DI CMPSB CMPSW CMPSD
SCAS ES: DI, AX SCASB SCASW SCASD

Wiederholungspräfixe

Wenn das REP-Präfix vor einem Zeichenfolgenbefehl gesetzt wird, z. B. REP MOVSB, wird der Befehl basierend auf einem im CX-Register platzierten Zähler wiederholt. REP führt den Befehl aus, verringert CX um 1 und prüft, ob CX Null ist. Es wiederholt die Befehlsverarbeitung, bis CX Null ist.

Das Richtungsflag (DF) bestimmt die Richtung der Operation.

  • Verwenden Sie CLD (Clear Direction Flag, DF = 0), um die Operation von links nach rechts durchzuführen.
  • Verwenden Sie STD (Set Direction Flag, DF = 1), um die Operation von rechts nach links durchzuführen.

Das REP-Präfix weist auch die folgenden Variationen auf:

  • REP: Es ist die bedingungslose Wiederholung. Der Vorgang wird wiederholt, bis CX Null ist.

  • REPE oder REPZ: Dies ist eine bedingte Wiederholung. Es wiederholt den Vorgang, während das Null-Flag gleich / Null anzeigt. Es stoppt, wenn der ZF ungleich / Null anzeigt oder wenn CX Null ist.

  • REPNE oder REPNZ: Dies ist auch eine bedingte Wiederholung. Es wiederholt den Vorgang, während das Null-Flag ungleich / Null anzeigt. Es stoppt, wenn der ZF gleich / Null anzeigt oder wenn CX auf Null dekrementiert wird.