Sers Leute,
angeregt von dem Thema über das verdunkeln einer Farbe habe ich mich heute hingesetzt, und dazu eine Funktion in Assembler geschrieben. Herausgekommen ist folgendes:
Delphi-Quellcode:
function Darken2(Value: TColor; Percentage: Byte): TColor;
var Buffer:
Array[0..3]
of Byte;
asm
PUSHA
MOV EBX, Value
XOR ECX, ECX
MOV CX, 3
@@CLC:
MOV AL, BL
MUL Percentage
MOV
DL, $64
DIV DL
MOV byte ptr buffer[3], al
SHR buffer, 8
SHR EBX, 8
SUB CX, 1
CMP CX, 0
JNE @@CLC
//LOOP @@CLC
MOV EAX, Buffer
MOV Result, EAX
POPA
end;
Das Loop ist deswegen kommentiert, weil es komischerwiese nicht ging. Er hat einfach weitergemacht, obwohl CX 3 war. Deswegen habe ich es selber geschrieben.
Jetzt meine Frage: Ich prüfe mit folgender Funktion die Zeit, die die Ausführung benötigt:
Delphi-Quellcode:
var Start: Int64;
I: Integer;
begin
Start:=GetTickCount;
for I:=0 to 50000000 do
Darken2(clRed, 50);
ShowMessage(IntToStr(GetTickCount-Start));
KANN es sein, dass ich 0ms rausbekomme? (AMD Athlon 3000+) Die gleiche Delphi-Funktion
Delphi-Quellcode:
function Darken(Value: TColor; Percentage: Byte): TColor;
type PP = ^DWord;
var Buffer: Array[0..3] of Byte;
I: Integer;
begin
PP(@Buffer)^ := Value;
for I:=0 to 2 do
Buffer[I] := (Buffer[I] * Percentage) DIV 100;
Result := PP(@Buffer)^;
end;
benötigt etwa 5000ms
Irgendwie ist das Komisch, und ich finde keinen Fehler
Gruß, Moritz
"Optimistisch ist diejenige Weltanschauung, die das Sein höher als das Nichts stellt und so die Welt und das Leben als etwas an sich Wertvolles bejaht."
Albert Schweitzer