![]() |
[ASM] While-Schleife tut was sie will
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:
das ist zwar ziemlich Sinnfrei...aber egal ;-)
begin
Akt:=0; while Akt<>5 do begin if Random(2)=1 then Inc(Akt); end; Memo1.Lines.Add(IntToStr(Akt)); end; Also ab in ASM damit...
Code:
Was nun passiert ist folgendes (Haltepunkte...)
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; + 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^^) |
Re: [ASM] While-Schleife tut was sie will
"call system.@RandInt"
Dann kannst du dir deine Zwischenfunktion sparen. |
Re: [ASM] While-Schleife tut was sie will
Zitat:
D2k5 Pers... BTW: Es scheint so als würde Delphi einfach bei jumps nicht anhalten, oder? aber jetzt wird EDX regemäßig geleert :-/ Immer beim Aufruf von Rand... |
Re: [ASM] While-Schleife tut was sie will
Zitat:
Tja, macht Delphi etwa auch bei IASM Code-Optimierung? Drück doch mal Strg+Alt+C beim Debuggen und schau mal, ob sich etwas geändert hat ![]() |
Re: [ASM] While-Schleife tut was sie will
Zitat:
Bei mir siehts jetzt so aus:
Delphi-Quellcode:
procedure KA;
asm mov ecx,0 cmp ecx,5 je @end @loop: mov eax,2 call rand cmp eax,1 jne @loop inc ecx cmp ecx,5 jne @loop mov eax,ecx call Add @end: ret end; |
Re: [ASM] While-Schleife tut was sie will
Zitat:
Zitat:
gut, 1 und 5 sind nun $01 und $05 usw, aber der rest is gleich den forenpost guck ich grad |
Re: [ASM] While-Schleife tut was sie will
Zitat:
*quellcode vergleich* |
Re: [ASM] While-Schleife tut was sie will
Zitat:
Delphi-Quellcode:
durch
JE @doinc
JMP @endeinnen {...} @endeinnen: JMP @start
Delphi-Quellcode:
o.ä. optimiert wird.
JNE @Start
|
Re: [ASM] While-Schleife tut was sie will
Hurra :bouncing4:
Ich habe das ganze noch etwas erweitert...
Delphi-Quellcode:
begin
Akt:=0; Cnt:=0; while Akt<>5 do begin if Random(2)=1 then Inc(Akt); Inc(Cnt); end; Memo1.Lines.Add(IntToStr(CNt)); end;
Delphi-Quellcode:
und es tut! :dp:
procedure Add(I: Integer);
begin Form1.Memo1.Lines.Add(IntToStr(I)); end; function Rand(N: Integer): Integer; begin Result:=Random(N); end; procedure Gen; begin asm MOV EBX,0 MOV ECX,0 @start: CMP EBX,5 JE @ende ADD ECX,1 PUSH EBX PUSH ECX MOV EAX,2 CALL Rand POP ECX POP EBX CMP EAX,1 JNE @start ADD EBX,1 JMP @start @ende: MOV EAX,ECX CALL Add end; end; auf zum nächsten (mehr oder weniger sinnlosen) asm-projekt :-) |
Re: [ASM] While-Schleife tut was sie will
Zitat:
Da muss man auch aufpassen. In Delphi ist es o, dass alle Register AUSSER EAX, ECX und EDX nach dem Funktionsaufruf gleich sind. Aber diese 3 Register solltest du selber sichern. Häufig missbraucht Delphi ESI zum zählen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz