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