Mélange de C et les fichiers d'Assemblage
Je veux utiliser un nu fonction dans mon programme en C++ à l'aide de g++. Malheureusement, g++, contrairement à VC++ ne prend pas en charge nu fonctions et la seule façon de gérer cela est d'écrire votre propre code assembleur dans un fichier séparé et lien avec vos fichiers C++. J'ai essayé de trouver quelques bon tutoriel pour x86 de mélanger de l'assemblée et C/C++, les fichiers, mais ne pouvais pas trouver tout bon.
Bien vouloir me faire savoir si vous savez à propos de tout. Notez que je ne suis pas de demander à propos de assembly en ligne mais la liaison C et de l'assemblée des fichiers et des façons de déclarer des variables extern C dans l'assemblée, et vice-versa d'ailleurs de les utiliser en C ou de l'assemblée, et aussi des façons de lier le C et l'asm fichiers à l'aide de Makefile.
- Essayer de le faire plus précis, c'est plutôt large et vague comme il est - dans le cas contraire, il sera probablement fermé comme "pas une vraie question". Rappelons également la les conseils antérieurs à vos questions sur l'utilisation de
gcc -S ...
pour produire de l'asm modèles etc. - gcc dans la même veine a
__attribute__((naked))
mais pas pour x86 🙁 - avez-vous jamais trouver comment accomplir ce que vous avez demandé? Je vais avoir le même problème.
- gcc a pris en charge
__attribute__((naked))
sur x86 pour un couple de versions, peut-être depuis gcc6.
Vous devez vous connecter pour publier un commentaire.
En C++ fichier:
en "nu" fichier asm, pour x86:
Compiler, de les assembler et de lien (avec g++ plutôt que ld, car il est beaucoup plus facile de le faire de cette façon pour le C++) et de l'exécution:
Si vous voulez passer des arguments à votre fonction ou de retour de tout ce que vous devez respecter les conventions d'appel.
Voici un exemple de truc pour atteindre le "nu fonction" effet.
Je veux juste ajouter une chose pour le post précédent.
Imaginez que vous voulez une fonction, qui acceptent des arguments:
(quelque chose comme
int add(int,int);
prototype)
enter
instruction. agner.org/optimize. Il n'y a aucune raison de construire un cadre de pile ici. Justemov eax, [esp+4]
/add eax, [esp+8]
/ret
. Aussi, ne pas tabasserebx
; c'est un appel préservé enregistrer dans toutes les conventions d'appel. Downvoting pour une dangereuse (et inefficace), par exemple, et que vous n'avez pas de montrer comment construire + le lien avec des MSNA.C'est ma façon de définir une fonction dans l'assemblée, il n'a pas besoin d'avoir un autre assembleur fichier, ni vous avez besoin pour échapper à chaque retour à la ligne. Vous pouvez simplement copier le contenu de l'assemblée des fichiers dans la chaîne de caractères littérale. Remarque: La raw multiligne littéral de chaîne est un C++11 fonctionnalité (vous aussi marqués C++). C'est utile, si vous voulez compiler le tout dans un
.c
-/.cpp
-fichier.Vous ne pouvez utiliser qu'un assemblage de base-déclaration sans paramètres supplémentaires à portée globale.
Lors de l'utilisation de GCC ou Clang et d'un processeur arm, vous êtes en mesure d'utiliser
[[gnu::naked]]
/__attribute__((naked))
.La première façon toujours permet de définir nu fonctions.
Cela permet également de rendre plus portable code.
and eax, 255
fait ce que vous voulez sur x86-32 et x86-64, et est un octet plus courte queand rax, 255
. Aussi,movzx eax, al
est un peu mieux sur les deux, parce que c'est plus court. Êtes-vous sûr que cette même assemble? La directive sur le gaz est.globl
ou.global
, pasglobal
. À l'aide degcc -masm=intel
utilise toujours les directives sur le GAZ, pas de MSNA. (Il compile bien, mais pas de les assembler. Sur godbolt, utiliser "binaire" mode assurez-vous qu'il assemble ainsi que les compilations.) Aussi, le BRAS n'a paseax
, il ar0
.rand_byte
est stupide de toute façon. Beaucoup mieux de faire justeuint8_t rand_byte
un faible alias pourrand
lorsque la convention d'appel permet à l'étroit valeurs de retour élevée de déchets (comme sur x86 mais pas de BRAS), et laisser l'appelant inline le zéro-extension si elle en a besoin. Il est presque impossible de venir avec des exemples en ligne de l'asm où il ne serait pas mieux de simplement les gcc.gnu.org/wiki/DontUseInlineAsm, mais, mais vous pouvez au moins le mentionner. (Sauf peut-être privilégié des instructions qui n'ont pas builtin / intrinsèque des wrappers).global
dans GNU C inline-asm. Il semble que vous seulement, il fixe pour les BRAS.R"(...)"
travaille en C11, donc, la suggestion de l'utiliser dans les deux.c
et.cpp
fichiers peuvent être faux. Utilisation-xc -std=gnu11
sur Godbolt pour compiler C.