@Furtbichler
ich habe heute dein networksort noch mal überarbeitet, so wie du schon gepostet hattest, und natürlich ist er schneller. ca. 10-20% gegenüber dem Selectionsort3
im prinziep ist der networksort ein shell-sort... ich hatte nur die reihenfolge der vergleiche nicht hinbekommen... (siehe mein 1ten post, ist bischen verkehrt^^)
Delphi-Quellcode:
procedure NetworkSort2(var B: ByteArray);
var
T: Byte;
begin
With B do begin
if A[0] > A[1] then begin T:= A[0]; A[0]:= A[1]; A[1]:= T; end;
if A[2] > A[3] then begin T:= A[2]; A[2]:= A[3]; A[3]:= T; end;
if A[0] > A[2] then begin T:= A[0]; A[0]:= A[2]; A[2]:= T; end;
if A[1] > A[3] then begin T:= A[1]; A[1]:= A[3]; A[3]:= T; end;
if A[1] > A[2] then begin T:= A[1]; A[1]:= A[2]; A[2]:= T; end;
end;
end;
habe jetzt dahingehen auch deine geniale idee mit CX und DX umgesetzt und da jeweils H und L verwendet
das spart mir ein paar mov's und die ganzen ROL und ROR
der tip war wirklich super
Delphi-Quellcode:
procedure SelectionsortASMDown2(
var A: Cardinal);
register;
label Weiter1,Weiter2,Weiter3,Weiter4,Weiter5;
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 CX,[EAX];
mov DX,[EAX+$02];
// init fertig
// if A[0] > A[1] then begin T:= A[0]; A[0]:= A[1]; A[1]:= T; end;
cmp DH,
DL;
jnb Weiter1;
xchg DH,
DL;
Weiter1:
// if A[2] > A[3] then begin T:= A[0]; A[0]:= A[2]; A[2]:= T; end;
cmp CH,CL;
jnb Weiter2;
xchg CH,CL;
Weiter2:
// if A[0] > A[2] then begin T:= A[0]; A[0]:= A[3]; A[3]:= T; end;
cmp DH,CH;
jnb Weiter3;
xchg DH,CH;
Weiter3:
// if A[1] > A[3] then begin T:= A[1]; A[1]:= A[2]; A[2]:= T; end;
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;
cmp
DL,CH;
jnb Weiter5;
xchg
DL,CH;
Weiter5:
mov [EAX],CX;
mov [EAX+$02],DX;
end;
mir fällt jetzt auch nix ein um das noch weiter zu optimieren
Code:
:00468578 668B08 mov cx, word ptr [eax]
:0046857B 668B5002 mov dx, word ptr [eax+02]
:0046857F 38D6 cmp dh,
dl
:00468581 7302 jnb 00468585
:00468583 86F2 xchg
dl, dh
:00468585 38CD cmp ch, cl
:00468587 7302 jnb 0046858B
:00468589 86E9 xchg cl, ch
:0046858B 38EE cmp dh, ch
:0046858D 7302 jnb 00468591
:0046858F 86F5 xchg ch, dh
:00468591 38CA cmp
dl, cl
:00468593 7302 jnb 00468597
:00468595 86D1 xchg cl,
dl
:00468597 38EA cmp
dl, ch
:00468599 7302 jnb 0046859D
:0046859B 86D5 xchg ch,
dl
:0046859D 668908 mov word ptr [eax], cx
:004685A0 66895002 mov word ptr [eax+02], dx
:004685A4 C3 ret
ich Danke euch allen für die hilfe
mfg Dano