Delphi-Quellcode:
function farbverlauf2(rot,gruen:integer):TColor;
begin
ASM
@kalt:
sub edx,eax;
erstmal das Begin-End ... darum wird doch bestimmt ein "unnötiger" Stackframe erstellt
und durch die nutzung von Result (mittendrin) ebenfalls ... dort wird Result<>EAX bestimmt sein, da zwischendurch eine Temp-Variable für Result eingerichtet und diese erst am Ende nach EAX kopiert wird.
außerdem wozu rechnest du da mit EDX, wo du EDX danach eh nichtmehr verwendest?
bei kalt also überall statt eax ein edx verwenden
und wenn das
ASM richtig genutzt würde (ohne delphis Stackframe), dann wäre Mov result,Eax; eh "nutzlos", da Result=EAX.
also ich würde mal stark vermuten, daß 'ne compileroptimierte Variante am Ende sogar schneller/optimaler arbeitet, als dieser
ASM-Code.
[add] *ins Bild guck* ... stümmt [/add]
PS: jns @kalt;
im High-Byte ist ein Steurbyte (bei der
GDI für die verwendete Farboalette) und keine der Farben Rot oder Grün, also hat dieser Vergleich nichts mit Rot-Grün zu tun.
oben im Bild:
Delphi-Quellcode:
function farbverlauf2(rot, gruen: Integer): TColor;
begin
if rot < gruen then result := rot - gruen
else result := (gruen - rot) shl 8;
end;
unten im Bild:
Code:
[b]function[/b] farbverlauf2(rot,gruen:integer):TColor;
[b]begin[/b]
[b]
ASM[/b]
Mov Eax,rot //init
Mov Edx,gruen
CMP Eax,edx
jns @kalt //rot<gruen
sub eax,edx
Mov result,Eax
jmp @weiter
@kalt:
sub edx,eax
shl [color=#ff0000]edx[/color], 8
Mov result, [color=#ff000]Edx[/color]
@weiter:
[b]end;[/b]
[b]end;[/b]
und in einem "neueren" Delphi, wo Inline-Funktionen unterstütz werden, wäre dieses das optimalste, da dort nichtmal erst 'ne Funktion angelegt, sondern der Code direkt an der aufrufenden Stelle eingefügt würde.
Delphi-Quellcode:
function farbverlauf2(rot, gruen: Integer): TColor; Inline;
begin
if rot < gruen then result := rot - gruen
else result := (gruen - rot) shl 8;
end;
[edit]
ups, Bild vergessen
[add]
und wenn ich mir den Code von jaenicke anseh ... bis auf
jmp @weiter;, welches in 'ner kleinem RET kürzer wär ... ist's schonmal ein sehr großer Fortschritt, gegenüber dem "Original"
[add2]
was du eigentlich meintest war:
(sobald du für rot und gruen mal 'nen Wert außerhalb von 0..255 übergibst, wirst du den Unterschied erkennen
)
Delphi-Quellcode:
function farbverlauf1(rot, gruen: Byte): TColor;
begin
if rot < gruen
then
result :=
rgb(rot - gruen, 0, 0)
else
result :=
rgb(0, gruen - rot, 0);
end;
function farbverlauf2(rot, gruen: Byte): TColor;
ASM
cmp al,
dl
jns @kalt
sub al,
dl
and eax, $0000ff
ret
@kalt:
sub eax, edx
xor eax, eax
// statt and eax, $00ff00
mov ah,
dl
//and eax, $00ff00
end;