7
votes

Supprimer le prologue d'une fonction écrite dans un assemblée pure

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: xxx

et je voudrais dire à Delphi de ne pas générer de prologue et d'épilogue pour cette fonction, comme C ++ 'S __ DeclSpec (Naked) < / Code> Caractéristique.

et donc personne ne perd son temps, je n'ai pas besoin d'aide pour que ces fonctions fonctionnent avec 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.

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.


0 commentaires

3 Réponses :


0
votes

ne

procedure SomeAssembly; stdcall;
asm
    ...
end;


1 commentaires

Si je me souviens bien, stdcall 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.



20
votes

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 ...


7 commentaires

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 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;