Einzelnen Beitrag anzeigen

Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

ASM - PChars vergleichen

  Alt 7. Okt 2006, 18:20
Ich versuche grad eine Funktion zu schreiben die überprüft ob das passwort richtig ist.. naja in der praxis wohl eher unnützlich so wies gemacht wird aber ist ja nur zum üben

mit cmp geht das ja nicht.. Dann hab ich mich im Inet umgeguckt (bzw Links von Balus asm tut^^) und bin darauf gestoßen:

Zitat:
CMPS (Vergleich zweier Stringelemente)

Syntax: CMPSB, CMPSW
Beschreibung: CMPS vergleicht ein Stringelement (Byte oder Wort) aus dem, durch das Registerpaar DS:SI adressierten, Quellstring mit dem, durch das Registerpaar ESI adressierten, Zielstring. In Abhängigkeit vom Zustand des Richtungsflags werden das SI- und das DI-Register um 1 (Byte) oder 2 (Wort) erhöht (DF=0) oder verringert (DF=1).
Operanden: Keine
Beispiel:
CLD
LEA SI,quellstring
LEA DI,zielstring
CMPSB
Bemerkung: CMPS vergleicht die beiden Operanden, indem er wie CMP den Quelloperanden vom Zieloperanden abzieht. Auch hier wird das Ergebnis durch Setzen der Statusflags angezeigt.

Um mehr als ein Element zu vergleichen, muß dem CMPS-Befehl ein REPE bzw. ein REPNE vorangestellt und die Anzahl der maximal durchzuführenden Vergleiche im CX-Register übergeben werden. Im ersten Fall wird der Vergleich solange wiederholt, bis CX gleich null oder die beiden Elemente nicht mehr übereinstimmen. Im zweiten Fall werden die beiden Strings solange verglichen, bis CX gleich null ist oder zwei Elemente übereinstimmen.
Delphi-Quellcode:
function PW(A: PChar): Pchar;
asm
 jmp @go
 @pw: DB 'geheim',0 // Das Passwort
 @sne: DB 'ne ungleich!',0 // Result wenn falsch
 @sja: DB 'jo is richtig :)',0 // Result wenn richtig
 @go: CLD // ab hier wirds komisch^^
      mov ESI,A // lea si,a geht nicht weil lea nicht geht und weil si zu klein ist
      lea EDI,@pw // di zu klein
      cmpsb // vergleichen
      jne @ne // kann man das mit jne machen?
      LEA EAX,@sja // Result := @sja
 RET
 @ne: LEA EAX,@sne // Result := @sne
end;
Die Fragen/Probleme stehn schon alle im Quelltext eigentlich

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat