Adressen von Prozedur-Parametern

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Aber alle statischen Libraries usw. nutzen FastCall!
PB Libs sind nichts anderes als gepackte statische Libraries.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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.
Zuletzt geändert von cxAlex am 21.03.2009 17:18, insgesamt 2-mal geändert.
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

> Du hast Recht:
endlich mal wieder :mrgreen:
so kanns Wochenende weiter gehen :lol:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Little John

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Little John

Beitrag 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
Antworten