AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ASM - PChars vergleichen

Ein Thema von Neutral General · begonnen am 7. Okt 2006 · letzter Beitrag vom 8. Okt 2006
Antwort Antwort
Seite 1 von 3  1 23      
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
Neotracer64

Registriert seit: 27. Okt 2004
292 Beiträge
 
Delphi 7 Professional
 
#2

Re: ASM - PChars vergleichen

  Alt 7. Okt 2006, 18:38
Tausche mal CMPSB mit CMPSD aus.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

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

Re: ASM - PChars vergleichen

  Alt 7. Okt 2006, 18:43
Zitat von Neotracer64:
Tausche mal CMPSB mit CMPSD aus.
compiliert zwar aber ändert insgesamt irgendwie nichts
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
Dax
(Gast)

n/a Beiträge
 
#4

Re: ASM - PChars vergleichen

  Alt 7. Okt 2006, 18:44
Kleb ein REPE bzw REPNE davor
  Mit Zitat antworten Zitat
Neotracer64

Registriert seit: 27. Okt 2004
292 Beiträge
 
Delphi 7 Professional
 
#5

Re: ASM - PChars vergleichen

  Alt 7. Okt 2006, 18:46
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.
  Mit Zitat antworten Zitat
Balu der Bär
(Gast)

n/a Beiträge
 
#6

Re: ASM - PChars vergleichen

  Alt 7. Okt 2006, 18:49
[OT]// 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]
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

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

Re: ASM - PChars vergleichen

  Alt 7. Okt 2006, 18:51
ok danke...

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
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
Neotracer64

Registriert seit: 27. Okt 2004
292 Beiträge
 
Delphi 7 Professional
 
#8

Re: ASM - PChars vergleichen

  Alt 7. Okt 2006, 19:02
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.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

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

Re: ASM - PChars vergleichen

  Alt 7. Okt 2006, 19:23
Ok danke euch allen

Aber warum funktioniert geheim2 auch?
Kann man das irgendwie umgehen?
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
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.064 Beiträge
 
Delphi XE2 Professional
 
#10

Re: ASM - PChars vergleichen

  Alt 7. Okt 2006, 19:31
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;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz