Hallo Leute!
Ich habe eben zur geistigen Erbauung und Unterstützung der Verdauung meine Routine, mit der ich
eine Speicherstelle in meiner Bitmap (24 Bit Farbtiefe) bei gegebener Füllfarbe FColor blende, in Assembler übersetzt. Dabei sind pCol der Zeiger auf
RGB im Speicher und FAC der Blending-Faktor im Bereich 0..1. So ...:
Delphi-Quellcode:
// Blendet ein Pixel mit Füllfarbe FColor und Faktor FAC=X/255=0..1
Procedure TDIBSection24.BlendColFACPtrF(pCol:PByte; FAC:Double);
Var Temp:Integer;
asm
// Init
push ebx
push esi
mov esi, eax
mov ebx, edx
xor eax, eax
xor edx, edx
mov al, Byte([esi].FColor)
mov
dl, [ebx]
sub eax, edx
mov Temp, eax
fild Temp
fmul FAC
sub esp, $04
fistp DWord Ptr[esp]
fwait
pop eax
add [ebx], al
inc ebx
mov al, Byte([esi].FColor+1)
mov
dl, [ebx]
sub eax, edx
mov Temp, eax
fild Temp
fmul FAC
sub esp, $04
fistp DWord Ptr[esp]
fwait
pop eax
add [ebx], al
inc ebx
mov al, Byte([esi].FColor+2)
mov
dl, [ebx]
sub eax, edx
mov Temp, eax
fild Temp
fmul FAC
sub esp, $04
fistp DWord Ptr[esp]
fwait
pop eax
add [ebx], al
pop esi
pop ebx
End;
Begin
pCol^:=pCol^+Round((TColorARGB(FColor).R-pCol^)*FAC); Inc(pCol);
pCol^:=pCol^+Round((TColorARGB(FColor).G-pCol^)*FAC); Inc(pCol);
pCol^:=pCol^+Round((TColorARGB(FColor).B-pCol^)*FAC);
End;
Ok, funktioniert beides sehr fix. Aber die Pascal Variante ist um mehr als 10% schneller als mein Assembler Code. Obwohl ich definitiv Befehle gespart habe. Der Call Round fehlt bei mir und die Register eax, edx werden nur anfangs genullt während der Compiler das für jeden Farbwert durchführt. Des weiteren wird von Round nen 64Bit Integer auf den Stack gepush während ich nur nen DWord nach eax übertrage.
Jetzt die Frage: WARUM ist mein Code langsamer in der Ausführung?

Gibt es da intere Spielregeln, die ich nicht kenne?

Ist nicht das erste Mal, dass mir eben diese aufgefallen ist.
Obwohl ich damit auch gleichzeitig ne Lanze für Delphi brechen kann. Da brummt schon ein guter Motor unter unserer Haube.
Viele Grüsse
OLLI