Autor |
Beitrag |
eruhenon
      
Beiträge: 53
|
Verfasst: Sa 24.05.08 00:07
Moin,
mein Problem sieht wie bereits erwähnt so aus, dass meine Zählervariable ohne Grund ihren Wert ändert.
Meine schleife sieht folgendermaßen aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function enlarge_key(key_old:TBuffer):TBuffer; var key_new:TBuffer; wert,i:integer; _byte:byte; Begin setlength(key_new,32);
for i:=0 to length(key_old)-1 do key_new[i]:=key_old[i];
for i:=0 to 32-length(key_old) do Begin wert:=rol_4_byte(key_old[i],key_old[i+1],key_old[i+2],key_old[i+3],(key_old[i+4] mod 32)); wert:=(wert shr 24); _byte:=byte(wert); key_new[length(key_old)+i]:=_byte; end;
Result:=key_new; |
TBuffer ist ein array of byte
nach dem Aufruf der rol_4_byte hat i einen negativen Wert. Wieso ist das der Fall?
die rol_4_byte:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function rol_4_byte(byte1,byte2,byte3,byte4:byte;wert:integer):integer; var rotation:integer; Begin asm xor ebx, ebx mov bh, byte1 mov bl, byte2 shl ebx, 8 mov bh, byte3 mov bl, byte4 mov ecx, wert rol ebx, cl mov rotation, ebx end; Result:=rotation; end; |
Danke schonmal für die Hilfe.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Sa 24.05.08 00:20
Moin!
eruhenon hat folgendes geschrieben: | Delphi-Quelltext 1:
| key_new[length(key_old)+i]:=_byte; | |
Täusche ich mich, oder ist dieser Index auf jeden Fall immer ausserhalb des Arrays  Das dürfte die komischsten Effekte haben...
Abgesehen davon kannst du dir key_new[] sparen, nimm gleich Result.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
eruhenon 
      
Beiträge: 53
|
Verfasst: Sa 24.05.08 00:33
nein der length(key_old) is wenn ich es teste immer 5
aber das Problem das ich sehe, ist dass i nach dem Aufruf folgendermassen aussieht:
Moderiert von Narses: Bild als Anhang hochgeladen
Einloggen, um Attachments anzusehen!
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Sa 24.05.08 00:51
Moin!
eruhenon hat folgendes geschrieben: | nein der length(key_old) is wenn ich es teste immer 5 |
Ja, sag ich doch, ist drüber:
for i:=0 to 32-length(key_old) do  32-5 = 27
key_new[length(key_old)+i]:=_byte;  5+27 = 32, der Index ist aber nur von 0..31 gültig, oder? setlength(key_new,32);
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
eruhenon 
      
Beiträge: 53
|
Verfasst: Sa 24.05.08 01:01
habs folgendermassen abgeändert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| for i:=0 to 31-length(key_old) do Begin wert:=rol_4_byte(key_old[i],key_old[i+1],key_old[i+2],key_old[i+3],(key_old[i+4] mod 32)); wert:=(wert shr 24); _byte:=byte(wert); key_new[length(key_old)+i]:=_byte; end; |
erhalte weiterhin die selbe Fehlermeldung, und dies ist beim ersten Durchlauf der Fall.. ergo bei length(key_old)+0 (5)
Die Fehlermeldung sieht folgendermassen aus:
Einloggen, um Attachments anzusehen!
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Sa 24.05.08 01:05
Moin!
Probier das mal so (zum testen):
Delphi-Quelltext 1: 2: 3: 4: 5:
| for i:=0 to 31-length(key_old) do Begin wert:=Random(256); key_new[length(key_old)+i]:=wert; end; | Knallt das immer noch?
cu
Narses
//EDIT: Das hier mal gelesen? 
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
eruhenon 
      
Beiträge: 53
|
Verfasst: Sa 24.05.08 01:11
Dann funktioniert es einwandfrei.
Es reicht sogar aus wenn ich
wert:=rol_4_byte(key_old[i],key_old[i+1],key_old[i+2],key_old[i+3],(key_old[i+4] mod 32));
auskommentier. Dann behält i auch den von der Schleife gegebenen Wert. Jedoch sobald ich diese Funktion aufrufe ändert sich dieser.
auf jeden Fall danke für die Hilfe=)
edit: also ich hab die rol_4_byte nun umgeschrieben. Mein erster Versuch hat trotz der Änderung der Register ncihts geändert. Jedoch funktioniert es esnn ich es folgendermassen schreibe:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function asm_rol(zahl,wert:integer):integer; Begin asm mov ecx, wert rol zahl, cl end; result:=zahl; end;
function rol_4_byte(Byte1,Byte2,Byte3,Byte4,wert:Byte):integer; var rotation:integer; Begin rotation:=0; rotation:=rotation or Byte1; rotation:=rotation shl 8; rotation:=rotation or Byte2; rotation:=rotation shl 8; rotation:=rotation or Byte3; rotation:=rotation shl 8; rotation:=rotation or Byte4; result:=asm_rol(rotation,wert); end; |
|
|
Muck
      
Beiträge: 98
Erhaltene Danke: 8
Win 8, Win 7, Vista, Win XP
Delphi XE3, Delphi 2009, Delphi 2007, Delphi 5
|
Verfasst: Sa 24.05.08 01:36
Hallo,
Dein Problem ist die Assembler Routine.
Die Delphi Code Optimierung speichert den Inhalt in der Schleife im Register BX, nicht wirklich in i.
ein for i:=0 to 9 wird z.B. von Delphi so aufgeloest.
xor ebx,ebx
dann das end;
inc ebx;
cmp ebx,$0a
jnz $00040000
Anderes Beispiel, dieser code wird endlos laufen, da bx auf null gesetzt wird.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Procedure Hallo; begin asm mov bx,0;end; end;
procedure TForm1.Button1Click(Sender: TObject); var I,J:Integer; begin for I := 0 to 9 do begin Hallo; Form1.Caption:=IntTOStr(I); end; end; |
In Deiner Routiner uebschreibest Du das BX und CX Register.
Stelle ein push ebx und push ecx an den Anfang.
Und vor dem Result:= ein pop ecx und pop ebx.
Danach sollte der ganze Spuk vorbei sein.
Markus
|
|
eruhenon 
      
Beiträge: 53
|
Verfasst: Sa 24.05.08 01:53
ich hab das nun so umgeschrieben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| asm push ebx push ecx xor ebx, ebx mov bh, byte1 mov bl, byte2 shl ebx, 8 mov bh, byte3 mov bl, byte4 mov ecx, wert rol ebx, cl mov rotation, ebx pop ecx pop ebx end; |
noch immer liegt der selbe Fehler vor...
was mir jedoch aufgefallen ist, ist dass i den selben Wert hat wie mein Rückgabewert.
edit: soo nun funktioniert es auf diese Weise. Aus irgenteinem Grund hat er die Änderungen in der Unit nicht übernommen. Hab sie an anderer Stelle gespeichert und überschrieben.
Danke für die Hilfe!!
|
|
|