| ||
auteur : Neitsa | ||
Windows :
Cross plate-forme (au minimum Linux & Windows) :
(merci à Gamera pour le lien vers FASM)
|
| ||
auteur : Neitsa | ||
Visual C++ ne permet plus l'utilisation de l'inlining Assembleur (Assembleur incorporé dans un programme en C ou C++). Pour pallier à ce problème vous pouvez :
|
| ||
auteur : Neitsa | ||
Il n'existe plus qu'une seule convention d'appel en mode 64 bits.
Cette dernière est semblable au type d'appel _fastcall, ce qui implique que les arguments, lors d'un appel de fonction, sont d'abord passés au travers des registres. Pour Windows :
Ref. : http://msdn2.microsoft.com/en-us/library/ms235286(VS.80).aspx Ref. : http://msdn2.microsoft.com/en-us/library/zthk2dkh(VS.80).aspx Ref. : https://www.microsoft.com/france/msdn/visualc/introduction-convention-appel-64bits.mspx Pour Linux :
Ref. : AMD64 ABI.
|
| ||
auteur : Neitsa | ||
Pour Windows : La valeur renvoyée par une fonction est placée dans le registre RAX, à moins que le résultat soit un type en virgule flottante, qui est alors renvoyé dans XMM0. Pour Linux : La valeur renvoyée par une fonction est placée dans le registre RAX et/ou RDX, à moins que le résultat soit un type en virgule flottante, qui est alors renvoyé dans XMM0 et/ou XMM1. Le retour de fonction peut aussi s'effectuer sous ST(0) ou ST(1) si la fonction manipule des données via le coprocesseur mathématique à virgule flottante (x87). |
| ||
auteur : Neitsa | ||
Pour Windows :
Ref. : http://msdn2.microsoft.com/en-us/library/9z1stfyw(VS.80).aspx Ref. : http://msdn2.microsoft.com/en-us/library/6t169e9c(VS.80).aspx Pour Linux :
|
| ||
auteur : Neitsa | ||
Contrairement à ce qu'avait annoncé dans un premier temps Microsoft la réponse finale et courte est : oui, sauf dans les drivers. Pour préciser cette réponse, Microsoft annonçait que la commutation de contexte (context switch) effaçait les registres ST(x) et XMM. Toutefois cette information s'est révélée fausse et a été corrigé par un responsable du programme Visual C++ et un programmeur du groupe Kernel chez Microsoft :
|
| ||
auteur : Neitsa | ||
La procédure (ou fonction) appelante est responsable de l'allocation de l'espace nécessaire sur la pile pour la procédure appelée.
Elle (la procédure appelante) doit toujours allouer suffisamment d'espace pour les 4 registres en paramètres même si la procédure appelée ne nécessite pas autant d'arguments.
La question est assez complexe; pour plus d'informations voir la référence ci-après : Ref. : http://msdn2.microsoft.com/en-us/library/ew5tede7(VS.80).aspx |
| ||
auteur : Neitsa | ||
Bien que la pile utilise des quadruples mots (8 octets soit 64 bits), le pointeur de pile (RSP) doit toujours être aligné sur un multiple de 16 avant d'appeler une API. Ref. : AMD64 ABI Ref. : http://msdn2.microsoft.com/en-us/library/ew5tede7(VS.80).aspx Pour se prémunir de ce problème, on peut utiliser un code comme celui-ci :
N.B : Certaines APIs supportent une pile mal alignée sans déclencher d'exception.
Certaines déclenchent une exception en interne et rétablissent (toujours en interne) une pile alignée.
D'autres encore ne supportent aucunement une pile mal alignée.
Dans le doute : alignez la pile avant l'appel.
|
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2007 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.