![]() |
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:
Delphi-Quellcode:
Die Fragen/Probleme stehn schon alle im Quelltext eigentlich :|
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; Gruß Neutral General |
Re: ASM - PChars vergleichen
Tausche mal CMPSB mit CMPSD aus. ;)
|
Re: ASM - PChars vergleichen
Zitat:
|
Re: ASM - PChars vergleichen
Kleb ein REPE bzw REPNE davor ;)
|
Re: ASM - PChars vergleichen
Stimmt hab falsch gedacht.
Das sollte gehen:
Delphi-Quellcode:
Problem: geheim2 wird auch akzeptiert.
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 |
Re: ASM - PChars vergleichen
[OT]
Delphi-Quellcode:
Richtig erkannt, und da ich annehme das du unter Win32 programmierst wirst du immer ESI nehmen müssen. ;) [/OT]
// lea si,a geht nicht weil lea nicht geht und weil si zu klein ist
|
Re: ASM - PChars vergleichen
ok danke...
Delphi-Quellcode:
aber wofür soll das gut sein?
mov ecx, 6
Das REPE versteh ich auch noch nicht aber da guck ich auf der Seite mal nach was das bringt :) Gruß Neutral General |
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. |
Re: ASM - PChars vergleichen
Ok danke euch allen :)
Aber warum funktioniert geheim2 auch? Kann man das irgendwie umgehen? |
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. |
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