Seite 3 von 3

Verfasst: 21.03.2009 16:51
von ts-soft
64-Bit nutzt meines Wissens nach kein stdcall, sondern fastcall, da werden
also unter Umständen Register statt stack verwendet.
Also ich würde es auch für Longs nicht nutzen wollen :mrgreen:

Verfasst: 21.03.2009 16:55
von cxAlex
@ts:

Die Aufrufkonvention hat gar nichts mit dem Betriebssystem oder x86/x64zu tun, nur mit dem Compiler. Und ich denke nicht das PB unter x64 auf einmal ne andere Konvention nutzt als unter x86.
Wikipedia hat geschrieben:Die Register- oder FastCall-Aufrufkonvention ist compilerspezifisch

Verfasst: 21.03.2009 17:00
von ts-soft
Aber alle statischen Libraries usw. nutzen FastCall!
PB Libs sind nichts anderes als gepackte statische Libraries.

Verfasst: 21.03.2009 17:03
von cxAlex
ts-soft hat geschrieben:Aber alle statischen Libraries usw. nutzen FastCall!
PB Libs sind nichts anderes als gepackte statische Libraries.
Wenn PB von Haus aus fastcall nutz ists ja gut. Ich meinte nur das das OS nichts mit der Konvention zu tun hat.

Verfasst: 21.03.2009 17:05
von ts-soft
Hab aber unter 64-Bit bisher nichts anders angetroffen!
Unter 32-Bit ist ja alles vertreten.

// edit
http://de.wikipedia.org/wiki/AMD64 hat geschrieben:Gleichzeitig wurde mit AMD64 eine neue Aufrufkonvention für Programmprozeduren (ABI) eingeführt, bei dem Parameter nicht mehr regelmäßig über den Programmstack laufen wie in den klassischen x86-Betriebsmodi, sondern in der Regel in Registern übergeben werden. Dieses registerorientierte ABI ist bei anderen Prozessorfamilien (wie PowerPC) schon länger üblich und kann zu einer Beschleunigung rechenintensiver Programme führen.

Verfasst: 21.03.2009 17:13
von cxAlex
@ts:

Du hast Recht:
MSDN hat geschrieben:Zwei wichtige Änderungen in x64 gegenüber x86 sind die 64-Bit-Adressierbarkeit und ein pauschaler Satz von 16 64-Bit-Registern zur allgemeinen Verwendung. Aufgrund des erweiterten Registersatzes verwendet x64 nur die __fastcall-Aufrufkonvention und ein RISC-basiertes Ausnahmebehandlungsmodell. Das __fastcall-Modell verwendet für die ersten vier Argumente Register und zur Übergabe der anderen Parameter den Stapelrahmen.
Aber es gibt anscheinend auch Ausnahmen.

//Edit:

Ich denke das der Performacegewinn kaum zu spüren sein wird:

Code: Alles auswählen

Procedure Call(p1, p2)
EndProcedure

t = ElapsedMilliseconds()
For i = 1 To 10000000
  Call(0, 0)
Next
t = ElapsedMilliseconds()-t
MessageRequester("", Str(t))
Ich kriegt immer nur 0 angezeigt, ab 100 Millionen krieg ich 96 ms angezeigt, also mehr als 1 Million Aufrufe/ms das ist vernachlässigbar.

Verfasst: 21.03.2009 17:16
von ts-soft
> Du hast Recht:
endlich mal wieder :mrgreen:
so kanns Wochenende weiter gehen :lol:

Verfasst: 21.03.2009 17:34
von Little John
Ja, dann werde ich schweren Herzens ganz auf meinen speziellen Spezialcode 8) verzichten. Vielen Dank für die vielen Informationen!

Gruß, Little John

Verfasst: 22.03.2009 16:13
von mk-soft
Mit Zeiger auf die Parameter zu arbeiten ist kein problem.
Habe dazu mal eine C-Funktionalität nach PB übernommen.

http://www.purebasic.fr/german/viewtopic.php?p=237382

Heute auf PB4.30 32 und 64 Bit übersetzt.

FF :wink:

Verfasst: 23.03.2009 02:10
von Little John
ts-soft hat geschrieben:64-Bit nutzt meines Wissens nach kein stdcall, sondern fastcall, da werden also unter Umständen Register statt stack verwendet.
Also ich würde es auch für Longs nicht nutzen wollen :mrgreen:
mk-soft hat geschrieben:Mit Zeiger auf die Parameter zu arbeiten ist kein problem.
Also funktioniert die folgende Prozedur allgemein zuverlässig oder nicht?

Code: Alles auswählen

Procedure Show (count, p1=0, p2=0, p3=0, p4=0, p5=0, p6=0)
   Protected i, *p.Integer

   *p = @p1
   For i = 1 To count
      Debug PeekS(*p\i)
      *p + SizeOf(*p)
   Next
EndProcedure


Debug "-- Tiere"
Show(3, @"Katze", @"Hund", @"Fisch")
Gruß, Little John