Seite 1 von 1
Per ASM function mit parameter aufrufen?
Verfasst: 28.08.2013 21:12
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
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.
Re: Per ASM function mit parameter aufrufen?
Verfasst: 28.08.2013 22:31
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.
Re: Per ASM function mit parameter aufrufen?
Verfasst: 28.08.2013 23:34
von Nero
Ok werde dann schauen das ich es anderst gebacken bekomme, danke für die schnelle antwort

Re: Per ASM function mit parameter aufrufen?
Verfasst: 29.08.2013 23:59
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
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
Re: Per ASM function mit parameter aufrufen?
Verfasst: 30.08.2013 10:07
von Nero
Danke für die Info werde mal schaun ob ich es hin bekomme.
Re: Per ASM function mit parameter aufrufen?
Verfasst: 30.08.2013 11:04
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.
Re: Per ASM function mit parameter aufrufen?
Verfasst: 30.08.2013 15:07
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.