31 votes

Comment le code C appelle-t-il le code assembleur (par exemple, strlen optimisé)?

J'ai toujours lu des choses à propos de l'utilisation de certaines fonctions dans le langage de programmation C sont optimisés par écrit dans l'assemblée. Permettez-moi de m'excuser si cette phrase sonne un peu erronée.

Donc, je vais vous le dire clairement: Comment est-il que lorsque vous appelez certaines fonctions comme strlen sur UNIX/C les systèmes, la fonction que vous appelez est écrit dans l'assemblée? Pouvez-vous écrire assemblée à droite dans les programmes en C, d'une manière ou est-ce un appel externe situation? Fait-il partie de la norme pour être en mesure de le faire, ou est-il un système d'exploitation spécifique de la chose?

34voto

David Heffernan Points 292687

La norme C dicte ce que chaque fonction de la bibliothèque doit faire, plutôt que de la façon dont il est mis en œuvre.

Presque tous connu des implémentations de C sont compilés en langage machine. C'est à la mise en œuvre du compilateur C/bibliothèque de la façon dont ils choisissent de mettre en œuvre des fonctions comme strlen. Ils pourraient choisir de mettre en œuvre en C et de le compiler pour un objet, ou ils peuvent choisir de l'écrire dans le montage et l'assemblage d'un objet. Ou ils pourraient mettre en œuvre une autre manière. Il n'a pas d'importance, aussi longtemps que vous obtenez l'effet et le résultat lorsque vous appelez strlen.

Maintenant, il se trouve que beaucoup de C de l'ensemble des outils vous permettent d'écrire assembly en ligne, mais ce n'est absolument pas partie de la norme. Ces équipements doivent être comprises comme des extensions de la norme.

17voto

fvu Points 21471

À la fin de la route, les programmes compilés et les programmes en assembleur sont tous en langage machine, ils peuvent donc s’appeler. La façon dont cela est fait est d'avoir le code d'assemblage utilisent les mêmes conventions d'appel (façon de préparer un appel, préparer des paramètres et autres) que le programme écrit en C. Un aperçu des conventions d'appel populaires pour les processeurs x86 peuvent être trouvés ici .

8voto

Nicholas Knight Points 9293

Beaucoup (la plupart?) Les compilateurs C ne se produisent à l'appui de inline assemblée, si elle ne fait pas partie de la norme. Cela dit, il n'y a pas de stricte nécessité d'un compilateur pour prendre en charge une telle chose.

Tout d'abord, reconnaître que l'assemblée est principalement de l'homme (semi-)lisible en code machine, et que C finit code machine de toute façon.

"En l'appelant" une fonction C génère simplement un ensemble d'instructions qui préparent les registres de la pile, et/ou dans certains autres dépendant de la machine mécanisme selon certaines établi convention d'appel, puis saute au début de la fonction appelée.

Un bloc de code assembleur peut être conforme à la convention d'appel appropriée, et donc de générer une goutte de code machine, une autre goutte de code machine qui a été initialement écrit en C est en mesure de les appeler. L'inverse est, bien sûr, également possible.

Les détails de la convention d'appel, le processus d'assemblage, et le processus de liaison (lien l'assemblée généré fichier objet avec le C-généré fichier objet) peut varier énormément entre les plates-formes, des compilateurs et des linkers. Un bon assemblée tutoriel pour votre plate-forme de choix sera probablement couvrir de tels détails.

J'arrive à la comme le x86 centrée sur le PC de l'Assemblée Tutoriel, qui traite spécifiquement de l'interfaçage de l'assemblée et du code C.

4voto

phihag Points 89765

Lorsque le code C est compilé par gcc, il est d'abord compilé en instructions d'assembleur, qui sont ensuite à nouveau compilées dans un fichier binaire exécutable par la machine. Vous pouvez voir les instructions d'assembleur générées en spécifiant -S , comme dans gcc file.c -S .

Le code assembleur ne fait que passer la première étape de la compilation C-to-assembler et il est alors impossible de le distinguer du code compilé à partir de C.

1voto

svick Points 81772

Une façon de le faire est d'utiliser l'assembleur en ligne. Cela signifie que vous pouvez écrire du code assembleur directement dans votre code C. La syntaxe spécifique est spécifique au compilateur. Par exemple, voir Syntaxe GCC et Syntaxe MS Visual C ++ .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X