Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [ASM] While-Schleife tut was sie will (https://www.delphipraxis.net/86636-%5Basm%5D-while-schleife-tut-sie-will.html)

glkgereon 16. Feb 2007 16:18


[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:
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^^)

sirius 16. Feb 2007 16:26

Re: [ASM] While-Schleife tut was sie will
 
"call system.@RandInt"

Dann kannst du dir deine Zwischenfunktion sparen.

glkgereon 16. Feb 2007 16:29

Re: [ASM] While-Schleife tut was sie will
 
Zitat:

Zitat von sirius
"call system.@RandInt"

Dann kannst du dir deine Zwischenfunktion sparen.

Öhm, das gibt es bei mir nicht :wall:
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...

sirius 16. Feb 2007 16:35

Re: [ASM] While-Schleife tut was sie will
 
Zitat:

Zitat von glkgereon
Zitat:

Zitat von sirius
"call system.@RandInt"

Dann kannst du dir deine Zwischenfunktion sparen.

Öhm, das gibt es bei mir nicht :wall:
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...

Klar, das gibts schon immer, z.B. in Delphi 7

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

Und schau mal hier den vorletzten Beitrag

Neutral General 16. Feb 2007 16:41

Re: [ASM] While-Schleife tut was sie will
 
Zitat:

Zitat von glkgereon
aber jetzt wird EDX regemäßig geleert :-/
Immer beim Aufruf von Rand...

Das hab ich auch grad festgestellt.. wahrscheinlich schreibt rand,bzw random was ins edx rein.. benutz doch mal ecx... ;)

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;

glkgereon 16. Feb 2007 16:44

Re: [ASM] While-Schleife tut was sie will
 
Zitat:

Zitat von sirius
Klar, das gibts schon immer, z.B. in Delphi 7

Meins kennt das aber nicht :?

Zitat:

Zitat von sirius
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

Und schau mal hier den vorletzten Beitrag

Im CPU-Fenster steht der selbe ASM-Code wie im Code.
gut, 1 und 5 sind nun $01 und $05 usw, aber der rest is gleich

den forenpost guck ich grad

glkgereon 16. Feb 2007 16:54

Re: [ASM] While-Schleife tut was sie will
 
Zitat:

Zitat von Neutral General
Zitat:

Zitat von glkgereon
aber jetzt wird EDX regemäßig geleert :-/
Immer beim Aufruf von Rand...

Das hab ich auch grad festgestellt.. wahrscheinlich schreibt rand,bzw random was ins edx rein.. benutz doch mal ecx... ;)

Könnte man nicht auch einfach PUSH EDX und POP EDX nehmen?

*quellcode vergleich*

Cöster 16. Feb 2007 17:10

Re: [ASM] While-Schleife tut was sie will
 
Zitat:

Zitat von glkgereon
Aber dann, bei JE @doinc springt er auf einmal nach CMP EDX,5

Ich nehme an, dass
Delphi-Quellcode:
JE @doinc
JMP @endeinnen
{...}
@endeinnen:
JMP @start
durch
Delphi-Quellcode:
JNE @Start
o.ä. optimiert wird.

glkgereon 16. Feb 2007 18:07

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:
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;
und es tut! :dp:

auf zum nächsten (mehr oder weniger sinnlosen) asm-projekt :-)

sirius 16. Feb 2007 18:37

Re: [ASM] While-Schleife tut was sie will
 
Zitat:

Zitat von Neutral General

Das hab ich auch grad festgestellt.. wahrscheinlich schreibt rand,bzw random was ins edx rein.. benutz doch mal ecx... ;)

Ja richtig, randint benutzt edx.
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 04:38 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz