Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   erste Gehversuche in Delphi InlineASM (https://www.delphipraxis.net/106111-erste-gehversuche-delphi-inlineasm.html)

rawsoul 5. Jan 2008 17:24


erste Gehversuche in Delphi InlineASM
 
Hallo,

das sind meine ersten Gehversuche in Delphi Inline ASM. Wie man sieht, es soll die Fibonacci Folge berechnen. Zum Einstieg habe ich mir das Tutorial von Balu der Bär angeschaut.

Es funktioniert soweit ich sehr gut (bis Schritt 45, ab da geht's ins negative), schon bei meinem dritten oder vierten Anlauf funktionierte es =)

Die Registergröße selbst kann man nicht ändern. Trotzdem gibt es ja Möglichkeiten, größere Werte (z.B. Int64) zu speichern. Wie gehe ich so etwas an? Mehrere Register für einen Zahlenwert nutzen vielleicht?

Außerdem würde ich mich freuen, wenn Ihr Schönheitsfehler nennen würdet (funktionieren tut es ja...), damit ich mir das von Anfang an angewöhnen kann =)

Delphi-Quellcode:
function fibonacci(step:integer):integer;
asm
   push ebx
   cmp step,2
   jbe @@end
   mov ecx,step
   sub ecx,2
   xor eax,eax
   mov ebx,1
   mov edx,2
   @@loop:
      xor eax,eax
      add eax,ebx
      add eax,edx
      mov ebx,edx
      mov edx,eax
      dec ecx
      cmp ecx,0
      jne @@loop
   @@end:
      pop ebx
end;
//Edit: Wurde etwas gekürzt...
//Edit2: Upps, da sind wohl ein paar Einrückungen futschgegangen...

Danke im Voraus,
Gruß,
Frank.

sirius 5. Jan 2008 17:29

Re: erste Gehversuche in Delphi InlineASM
 
Was du benötigst ist "add with carry" (Addieren mit Übertrag) In asm ist das "adc"
du addierst erst die unteren 32bit und dann mit adc die oberen 32bit.

Edit:
Ein bisschen kürzen kannst du deinen Code schon noch, aber das ist dir sicherlich klar.
Was mir noch auffällt ist folgendes:
- Du rettest eax,ecx und edx und stellst die Register am Ende wieder her. Das ist nicht notwendig. Diese drei Register dürfen in Funktionen beliebig verändert werden. Ausserdem, und das ist Punkt 2:
- In EAX landet das Ergebnis (also Result)
- Step wird in EAX übergeben. Du kannst es zwar so lassen, dann wird der Compiler für dich noch ein wenig Arbeit verrichten (EAX=Step auf den Stack legen, dass du es von da immer ansprechen kannst)

stefan2005 5. Jan 2008 17:48

Re: erste Gehversuche in Delphi InlineASM
 
hi,
wenn du Delphi Code per Breakpoint irgendwo stoppst, und anschließend das CPU Fenster öffnest (in D6 mit STRG+ALT+C), dann siehst du dort den von Delpgi erstellten Assemblercode und kannst z.B. nackgucken wie Delphi 64-Bit Zahlen addiert.

In einer normalen Delphi-Funktion, wird der Rückgabewert (also Result) sowieso in EAX gespeichert.

Grüsse,
Stefan

rawsoul 5. Jan 2008 17:57

Re: erste Gehversuche in Delphi InlineASM
 
Konnte dank euch beiden nun ein wenig gekürzt werden. Ich mache mich jetzt an die 64Bit Zahlen :)

sirius 5. Jan 2008 18:05

Re: erste Gehversuche in Delphi InlineASM
 
Ein Vorschlag für int64 (Rückgabe jetzt in eax und edx)
Delphi-Quellcode:
function fibo(n:integer):int64;
asm
  mov ecx,eax
  xor eax,eax
  xor edx,edx
  test ecx,ecx
  jz @end
  inc eax
  add ecx,-2
  jle @end
  push edi
  push esi
  mov edi,eax
  mov esi,edx

  @rep:
  push eax
  push edx
  add eax,edi
  adc edx,esi
  pop esi
  pop edi
  dec ecx
  jnz @rep

  pop esi
  pop edi
  @end:
end;

MrSmile 5. Jan 2008 18:44

Re: erste Gehversuche in Delphi InlineASM
 
was bedeutet der Befehl '@@'?

sirius 5. Jan 2008 18:51

Re: erste Gehversuche in Delphi InlineASM
 
Zitat:

Zitat von MrSmile
was bedeutet der Befehl '@@'?

Gar nix, das ist nur ein Label (inkl. dem, was dahinter steht).
Edit: ein @ hätte gereicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:20 Uhr.

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