J'utilise Delphi 2010. Est-il possible de dire à Delphi de ne pas générer de prologue pour une fonction? J'écris quelques fonctions de montage pure comme ceci: et je voudrais dire à Delphi de ne pas générer de prologue et d'épilogue pour cette fonction, comme C ++ 'S et donc personne ne perd son temps, je n'ai pas besoin d'aide pour que ces fonctions fonctionnent avec em> le prologue; Je peux déjà faire ça. C'est juste un inconvénient important et fera de l'entretien un énorme tracas. Je vais devoir inspecter manuellement les prologues générés par le compilateur pour voir leur longueur, et si cela change, mon programme se bloquera. P> Je sais aussi que je peux écrire la fonction comme une série d'octets dans un Array d'octet, mais ce serait encore pire que de devoir aller trouver la longueur du prologue de Delphi. p> p> __ DeclSpec (Naked) < / Code> Caractéristique. P>
3 Réponses :
ne
procedure SomeAssembly; stdcall; asm ... end;
Si je me souviens bien, stdcall code> provoque le compilateur d'inclure un prologue et un épilogue pour sauvegarder et restaurer le pointeur de trame, même s'il n'y a pas de paramètres.
Delphi ne génère pas de prologues ni d'épilogues pour des fonctions ayant aucun argument em> et déclaré avec la convention de l'appel em>. Si vous souhaitez des fonctions sans prologues, déclarez-les en tant qu'affictions zéro, fonctions d'enregistrement-appeling-convention. Aussi, sauvez le commencer code> -
BLOCK CODE> BLOCK et allez directement dans l'assemblage.
SomeAssemblyProc := TSomeAssemblyProc(@SomeAssembly);
if SomeAssembly(2, 'foo') then ...
Pourquoi tout le monde ne peut-il pas quand même répondre à cela? Extrêmement utile, merci rob.
@K. Charles: Niveau d'expertise différent? C'était une supposition sauvage, cependant, aucune infraction envisagée à personne.
N'y a-t-il pas un niveau supplémentaire d'indirection lorsque vous avez un pointeur de fonction? Personnellement, j'aurais pensé que TASM serait plus approprié.
S'appuyant sur un pointeur de fonction pour sauter le prologue généré par Delphi sonne un peu hacky et pas très futur.
@COSMIN, nous ne nous appuyons pas sur un pointeur de fonction pour sauter le prologue. Le prologue n'existe même plus en raison de la définition de la fonction (qui était le point de cet exercice).
Oui, @david, c'est un niveau supplémentaire d'indirection. Ce n'est pas pire que d'importer une fonction d'une DLL, cependant. (En fait, c'est là que j'ai appris cette technique. J'étais corriger la table d'importation d'un EXE < / a> Pour pointer vers de nouvelles fonctions d'assembleur. Les fonctions ont été appelées comme STDCALL, mais si je les ai définies de cette façon, ils ont reçu des prologues fournis par le compilateur que je devais ensuite "annuler" avant d'arriver au travail réel.)
Ce n'est pas entièrement correct. Aussi fonctionne (ASM..end; -Only) avec une convention d'appel de registre, aucune variables locales, et aucun argument passé via la pile i> n'a aucun prologue. Cela signifie jusqu'à 3 (U) des arguments int32 sont toujours bien. Par exemple. Ce qui suit n'a toujours pas de prologue: Test de la fonction1 (A, B, C: Mots de long terme): longword; ASM NOP fin;
@downvoteurs, veuillez expliquer. TASM fait partie de Delphi et c'est la manière naturelle de travailler avec une assembleuse 100% pure. Ce vote stratégique était-il?