Maschinensprache i8086/ Stringbefehle
Theorie:
Einleitung – Maschinensprache –
Assembler – Zahlensysteme –
RAM-Adressen – BWS – Debug –
CPU-Register – Einfache Befehle – Stringbefehle – Interrupts –
I/O-Ports
Versuch:
BWS1 – BWS2 –
Hallo Welt – Bootsektor – MBR
Nützlich:
Befehlsliste – PAUSE – Filter
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