Registriert seit: 12. Aug 2004
49 Beiträge
|
AW: Hilfe: Schnellste möglichkeit ein 4-Byte Array zu Sortieren
13. Feb 2012, 01:14
procedure SelectionsortASMDown(var A: Cardinal); register;
vieleicht kannst du die proceduren mal mit "register" angeben, weil dann der compiler vor dem aufruf der procedur ein LEA (Load Effective Adress) nach EAX macht... und dann sollten die geposteten ASM-Proceduren eigentlich funktionieren
Delphi-Quellcode:
procedure TArrayOfByteList.SelectionsortASM( var A: TArrayOfByte); register;
label Weiter1,Weiter2,Weiter3,Weiter4,Weiter5,Weiter6;
asm
// In einer asm-Anweisung muss der Inhalt der Register
// EDI, ESI, ESP, EBP und EBX erhalten bleiben, während die Register
// EAX, ECX und EDX beliebig geändert werden können.
mov ECX,[EAX]; // A in ECX
mov DL,CL;
rol ECX,8;
// init fertig
// if A[0] > A[1] then begin T:= A[0]; A[0]:= A[1]; A[1]:= T; end;
cmp DL,CL;
jnb Weiter1;
xchg DL,CL;
Weiter1:
// if A[0] > A[2] then begin T:= A[0]; A[0]:= A[1]; A[1]:= T; end;
rol ECX,8
cmp DL,CL;
jnb Weiter2;
xchg DL,CL;
Weiter2:
// if A[0] > A[3] then begin T:= A[0]; A[0]:= A[1]; A[1]:= T; end;
rol ECX,8;
cmp DL,CL;
jnb Weiter3;
xchg DL,CL;
Weiter3:
// if A[1] > A[3] then begin T:= A[1]; A[1]:= A[2]; A[2]:= T; end;
rol EDX,8;
mov DL,CL;
ror ECX,8;
cmp DL,CL;
jnb Weiter4;
xchg DL,CL;
Weiter4:
// if A[1] > A[2] then begin T:= A[1]; A[1]:= A[3]; A[3]:= T; end;
ror ECX,8;
cmp DL,CL;
jnb Weiter5;
xchg DL,CL;
Weiter5:
// if A[2] > A[3] then begin T:= A[2]; A[2]:= A[3]; A[3]:= T; end;
rol EDX,8;
mov DL,CL;
rol ECX,8;
cmp DL,CL;
jnb Weiter6;
xchg DL,CL;
Weiter6:
rol EDX,8;
mov DL,CL;
mov [EAX],EDX;
end;
hab es selber noch nicht getestet
aber wäre mir jetzt so aufgefallen... nicht das er die var über den stack übergibt
mov ECX,[EAX]; // A in ECX
sagt das er die varieable die an der speicherstelle steht auf die eax zeigt nach ECX kopieren soll... darum [eax]... ist immer eine dereferenzierung so wie bei zeigern/pointern
mfg Dano
Geändert von Dano (13. Feb 2012 um 01:31 Uhr)
|