Autor Beitrag
eruhenon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53



BeitragVerfasst: 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:

ausblenden 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+4mod 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 24.05.08 00:20 
Moin!

user profile iconeruhenon hat folgendes geschrieben:
ausblenden 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 :shock: Das dürfte die komischsten Effekte haben... :nixweiss:

Abgesehen davon kannst du dir key_new[] sparen, nimm gleich Result. :idea: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
eruhenon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53



BeitragVerfasst: 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 user profile iconNarses: Bild als Anhang hochgeladen
Einloggen, um Attachments anzusehen!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 24.05.08 00:51 
Moin!

user profile iconeruhenon 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 :arrow: 32-5 = 27

key_new[length(key_old)+i]:=_byte; :arrow: 5+27 = 32, der Index ist aber nur von 0..31 gültig, oder? :arrow: setlength(key_new,32); :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
eruhenon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53



BeitragVerfasst: Sa 24.05.08 01:01 
habs folgendermassen abgeändert:

ausblenden 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+4mod 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 24.05.08 01:05 
Moin!

Probier das mal so (zum testen):
ausblenden 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? :lupe:

_________________
There are 10 types of people - those who understand binary and those who don´t.
eruhenon Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53



BeitragVerfasst: 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+4mod 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98
Erhaltene Danke: 8

Win 8, Win 7, Vista, Win XP
Delphi XE3, Delphi 2009, Delphi 2007, Delphi 5
BeitragVerfasst: 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 53



BeitragVerfasst: Sa 24.05.08 01:53 
ich hab das nun so umgeschrieben:

ausblenden 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!!