Hi,
Ich spiele gerade was mit dem Delphi-Inline-Assembler rum (Mit der Absicht dann irgendwann einen anderen Quellcode etwas optimieren zu können.
Ich habe mir einfach mal folgenden Code genommen:
Delphi-Quellcode:
begin
Akt:=0;
while Akt<>5 do
begin
if Random(2)=1 then Inc(Akt);
end;
Memo1.Lines.Add(IntToStr(Akt));
end;
das ist zwar ziemlich Sinnfrei...aber egal
Also ab in
ASM damit...
Code:
procedure Add(I: Integer);
begin
Form1.Memo1.Lines.Add(IntToStr(I));
end;
function Rand(N: Integer): Integer;
begin //Hier hatte ich ein Problem mit dem Optionalen Parameter...
Result:=Random(N);
end;
asm
MOV EDX,0 //Erstmal nullen
@start: //Schleifenanfang
CMP EDX,5 //Ist es 5?
JE @ende //JMP ende
MOV EAX,2 //1. Param für Rand
CALL Rand //Rand Callen
CMP EAX,1 //ist Ergebnis 1?
JE @doinc //Dann JMP doinc
JMP @endeinnen //Sonst JMP schleifenende
@doinc: //doinc
ADD EDX,1 //EDX erhöhen
@endeinnen: //Schleife zuende
JMP @start //Zum Schleifenanfang
@ende: //Am Ende
CALL Add //Add Callen
end;
Was nun passiert ist folgendes (Haltepunkte...)
+ 0 nach EDX
+ übergeht JE @ende
+ 2 nach EAX
+ Call Rand
Aber dann, bei JE @doinc springt er auf einmal nach CMP EDX,5
Und das versteh ich überhaupt nicht....
kann mir da mal irgendwer auf die Sprünge helfen? (im wahrsten sinne des wortes^^)