Per ASM function mit parameter aufrufen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Per ASM function mit parameter aufrufen?

Beitrag von Nero »

Hiho,

hab da mal ne frage kann mir wer sagen wie ich aus einer PB Procedure heraus per ASM eine function mit parametern aufrufen kann?
Soweit ich das verstanden habe muß man erst per !PUSH die Parameter vor den !CALL setzen, naja mehr als nen IMA bekommt ich nicht zusammen :lol:
Ich muss der funktion einen Pointer auf eine Structure übergeben welche die function füllt, die function liefert keinen rückgabewert.

Hab noch nie was mit ASM machen müssen daher stehe ich da grad echt aufm Schlauch.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Per ASM function mit parameter aufrufen?

Beitrag von STARGÅTE »

Kurz gesagt: Lass es lieber!

ASM und PB zu mischen führt zu unabschätzbaren Fehlerquellen.

Pure Basic bietet ja die Möglichkeit Proceduren über die Adresse aufzurufen (Stichwort: Prototype)

Wenn ich trotzdem nicht überzeugen konnte hier einige Hinweise:
Wenn du Strings übergeben willst, musst du zusätzlich die PB_String Funnktioen zum reservieren und Freigeben aufrufen:
_SYS_AllocateString, _SYS_FreeString
Bei CALL musst du natürlich hinten abgeben, wie viele Bytes übergeben wurden @Länge

Wenn du PUSH ausführst, musst du natürlich auch wieder POP aufrufen, da sonst der Stack-Pointer (esp) kaputt gemacht wird, und nachfolgende Codes auf falsche Parameter zugreifen.

PB Benutzt logischerweise Register, welche du (wenn du sie veränderst) natürlich schützen musste, damit der nachfolgende Code weiter stabil arbeitet.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: Per ASM function mit parameter aufrufen?

Beitrag von Nero »

Ok werde dann schauen das ich es anderst gebacken bekomme, danke für die schnelle antwort :D
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Per ASM function mit parameter aufrufen?

Beitrag von Thorium »

Nero hat geschrieben: Soweit ich das verstanden habe muß man erst per !PUSH die Parameter vor den !CALL setzen, naja mehr als nen IMA bekommt ich nicht zusammen :lol:

Hab noch nie was mit ASM machen müssen daher stehe ich da grad echt aufm Schlauch.
Na dann zuerstmal Grundlagen lernen. ASM ist keine Sprache mit festen Regeln wie was gemacht werden muss. Es gibt daher keinen festen Weg wie man mit ASM eine Prozedur in PureBasic aufruft.

Die Prozedur, welche du aufrufen möchtest, gibt vor wie sie aufzurufen ist. Also nicht nur welche Parameter sie bekommt und was sie zurückgibt sondern auch wie sie diese Parameter bekommt und wie sie diese zurückgibt. Das nennt sich Aufrufkonvention oder Call Convention.

Das heisst du musst erstmal wissen welche Call Convention die Prozedur nutzt, welche du aufrufen möchtest.
In den meisten Fällen ist das StdCall oder CDECL.

StdCall z.B. legt fest das alle Parameter über den Stack übergeben werden und von Rechts nach Links (also Rückwärts) auf den Stack gelegt werden. Das wird üblicherweise mit Push Instruktionen gemacht.
Der Rückgabewert wird im Register EAX übergeben und die aufgerufene Prozedur räumt den Stack auf bevor sie die Ausführung an deine Prozedur zurückgibt.

Desweiteren muss bekannt sein welche Register sich durch die Prozedur ändern könnten. Diese müssen vor dem Aufruf gesichert werden. StdCall gibt vor das sich die Register EAX, ECX, und EDX ändern können. In der ABI (Application Binary Interface) Definition können allerdings noch weitere definiert sein. Wenn man sicher gehen möchte, sichert man einfach alle Register.

Für eine Auflisten von verschiedenen Calling Conventions: http://de.wikipedia.org/wiki/Aufrufkonvention
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: Per ASM function mit parameter aufrufen?

Beitrag von Nero »

Danke für die Info werde mal schaun ob ich es hin bekomme.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Per ASM function mit parameter aufrufen?

Beitrag von STARGÅTE »

Könntest du uns kurz erklären, warum du zu ASM wechseln musst/willst?

Vllt kann dein Problem auch anders, auf einem einfachen Weg, gelöst werden.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Nero
Beiträge: 285
Registriert: 08.11.2004 01:50

Re: Per ASM function mit parameter aufrufen?

Beitrag von Nero »

Das problem hat sich erledigt.
Wollte auf ne interne PB function zugreifen die per import nur ne Polink erzeugt. Naja mein fehler an der ganzen sache war ich hab mich im pblibtool verguckt und
die function brauch garkeine parameter. Das ist gut den wie ich eine ohne parameter aufrufe hab ich rausgefunden und es funktioniert prima.

Mache das so:

Code: Alles auswählen

Procedure SetScreenProjectionMatrix()
  Protected *ProjectionMatrix
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x86   
    !extrn _PB_Screen_ProjectionMatrix
    !MOV EAX,DWord _PB_Screen_ProjectionMatrix
    !MOV DWord [p.p_ProjectionMatrix],EAX 
  CompilerElse       
    !extrn PB_Screen_ProjectionMatrix
    !MOV RAX,QWord PB_Screen_ProjectionMatrix 
    !MOV QWord [p.p_ProjectionMatrix],RAX  
   CompilerEndIf  
  ProcedureReturn *ProjectionMatrix
EndProcedure


Würde ja auch nen import bevorzugen aber wie gesagt gibt nen Polink weil ich import "" machen muss und weil die function im subsystem steckt und diese Datei sich nicht einbinden läst.
Antworten