Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ASM - PChars vergleichen (https://www.delphipraxis.net/78600-asm-pchars-vergleichen.html)

Neutral General 7. Okt 2006 17:20


ASM - PChars vergleichen
 
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 :mrgreen:

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 ES:DI 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

Neotracer64 7. Okt 2006 17:38

Re: ASM - PChars vergleichen
 
Tausche mal CMPSB mit CMPSD aus. ;)

Neutral General 7. Okt 2006 17:43

Re: ASM - PChars vergleichen
 
Zitat:

Zitat von Neotracer64
Tausche mal CMPSB mit CMPSD aus. ;)

compiliert zwar aber ändert insgesamt irgendwie nichts :(

Dax 7. Okt 2006 17:44

Re: ASM - PChars vergleichen
 
Kleb ein REPE bzw REPNE davor ;)

Neotracer64 7. Okt 2006 17:46

Re: ASM - PChars vergleichen
 
Stimmt hab falsch gedacht.
Das sollte gehen:

Delphi-Quellcode:
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
      mov ESI,A
      lea EDI,@pw
      mov ecx, 6
      repe cmpsb
      jne @ne
      LEA EAX,@sja
RET
@ne: LEA EAX,@sne
Problem: geheim2 wird auch akzeptiert.

Balu der Bär 7. Okt 2006 17:49

Re: ASM - PChars vergleichen
 
[OT]
Delphi-Quellcode:
// lea si,a geht nicht weil lea nicht geht und weil si zu klein ist
Richtig erkannt, und da ich annehme das du unter Win32 programmierst wirst du immer ESI nehmen müssen. ;) [/OT]

Neutral General 7. Okt 2006 17:51

Re: ASM - PChars vergleichen
 
ok danke...

Delphi-Quellcode:
mov ecx, 6
aber wofür soll das gut sein?

Das REPE versteh ich auch noch nicht aber da guck ich auf der Seite mal nach was das bringt :)

Gruß
Neutral General

Neotracer64 7. Okt 2006 18:02

Re: ASM - PChars vergleichen
 
Du weisst ja bereits, dass jedes Zeichen einen Byte belegt.
cmpsb vergleicht immer nur ein Zeichen.
Damit mehr Zeichen vergleicht werden können schreibt man ein REPE davor.
Es wiederholt den befehl cmpsb sooft wie es in ECX steht oder solange beide Zeichenketten noch gleich (EQUAL) sind.
Und da 'geheim' 6 Zeichen lang ist, habe ich ne 6 genommen.
Und damit nicht immer das erste Zeichen von den beiden Strings verglichen wird, inkrementiert REPE auch noch autmatisch die Adressen in ESI und EDI.

Neutral General 7. Okt 2006 18:23

Re: ASM - PChars vergleichen
 
Ok danke euch allen :)

Aber warum funktioniert geheim2 auch?
Kann man das irgendwie umgehen?

Amateurprofi 7. Okt 2006 18:31

Re: ASM - PChars vergleichen
 
Neutral General,

Ich würde als Ergebnis der Funktion nicht einen PChar sondern einen Boolean Wert verwenden.
Ansonsten müßtest Du nach Rückkehr aus der Prüfroutine noch prüfen, ob der PChar auf den
Text 'jo is richtig :)' zeigt.

Ich denke der Sinn der Prüfroutine ist, zu prüfen ob das Password richtig ist, um dann entsprechend reagieren zu können, und nicht nur den Text auszugeben.
Und ESI, EDI sollen nicht verändert werden.
So sollte es funktionieren (habs nicht geprüft !)

Delphi-Quellcode:
function PW(A: PChar):Boolean;
asm
      jmp  @go
@pw: DB 'geheim',0  // Das Passwort
@go: push esi     // Register retten, dürfen nicht verändert werden
      push edi
      mov  esi,eax // Adresse A
      lea  edi,@pw // Adresse PW
      cld           // 'Suchrichtung' vorwärts
      mov  ecx,7    // 7 Zeichen (einschl. 0 sind zu prüfen)
      repe cmpsb   // vergleicht solange, bis entweder ECX Zeichen geprüft sind, oder Ungleichheit festgestellt wurde
      sete al      // setzt result dann=1 (true), wenn ZF=1 ist
      pop  edi
      pop  esi
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz