2017-11-18 8 views
4

Ich möchte die Benutzereingabe im Register si mit einer anderen Zeichenfolge vergleichen.
Übrigens benutze ich FASM. Hier ist mein Code so weit nach der Benutzereingabe.
Wenn ich den Befehl repe cmpsb benutze, weiß ich, dass ich das zusätzliche Segment verwenden muss, aber ich weiß nicht wie. Und der Befehl repe cmpsb funktioniert nicht mit diesem Code.Wie zwei Strings in x86-Assembly mit FASM zu vergleichen?

.input_done: 
    cmp si, 0 
    je no_input 
    jmp short .compare_input 


.compare_input: 
    mov cx, 20 ;For the repe cmpsb command. 
    cld 
    mov di, info ;The string I want to compare. 
    mov es, di 
    mov di, info 
    repe cmpsb 
    cmp cx, 0 
    je showinfo 
.showinfo: 
    ... ;The output string if both string are the same. 

info db "info", 0 
+2

Sie müssen nicht nur Assembler, sondern auch Zielplattform angeben. Zum Beispiel in Linux ist dies einfach falscher Code, da es weder 32b noch 64b Zeiger verwendet. Wenn Sie also sagen würden, dass dies DOS 16b ist, müssten wir sehen, wie Sie die Daten definiert haben, und um gute Fragen zu stellen, sollten Sie versuchen, [MCVE] selbst zu erzeugen, zum Beispiel setzt Ihr aktueller Code 'di' zweimal, aber es ist nicht klar, was in 'si' ist (entweder einstellen, oder einen klaren Kommentar hinzufügen). – Ped7g

+0

Und hier ist ein Artikel, der 'Segment: Offset'-Adressierung im 16B Real-Modus erklärt (für Sie, um eine bessere Vorstellung zu bekommen, wofür' es' und 'ds' sind): http://thestarman.pcmministry.com/asm/ debug/Segments.html – Ped7g

Antwort

2
mov di, info ;The string I want to compare. 
mov es, di 

Für ein einfaches Programm, um es wahrscheinlich wahr ist, dass beiden Strings in dem gleichen Speichersegment gespeichert werden. Platzieren Sie einfach den Wert von DS in ES.

... 
push ds 
pop es 
mov di, info 
... 

Und die repe cmpsb Befehl mit diesem Code funktioniert nicht.

Sie den Zähler festgelegt haben CX auf eine feste Anzahl von 20, wobei mindestens eine der Saiten („info“) hat nur 4 Zeichen. Kein Wunder, dass der Vergleich fehlschlägt.

Da Sie für die Gleichheit vergleichen möchten, wird Ihr erster Schritt sein, um zu sehen, ob beide Saiten die gleichen Längen haben. Wenn nicht, kennen Sie die Antwort bereits.
Wenn sie die gleiche Länge haben, dann verwenden Sie das als Zähler CX.

; String1 pointer in DS:SI, length in CX 
; String2 pointer in ES:DI, length in DX 

cmp cx, dx 
jne NotEqual 
repe cmpsb 
jne NotEqual 
Equal:  ; .showinfo: 
...   ; The output string if both string are the same. 
; Don't fall through here!!! 
NotEqual: 
... 
+1

der Endzustand von 'repe 'wird auch falsch behandelt. (Zerstöre es durch 'cmp cx, 0 'anstelle von' jcxz 'oder eher Test für' jne 'Zustand). – Ped7g

Verwandte Themen