Question

Je comprends que l'écriture dans l'assemblage ou l'ajout d'un assemblage à un programme nuit à sa portabilité. Mais à quel point? Je veux dire, fondamentalement tous les PC sont x86 ou x64 ces jours-ci, non? Donc, si j'intègre un assemblage dans un programme C, pourquoi ne compilerait-il toujours pas, peu importe où il se trouve?

Est-ce que cette notion de non-portabilité fait simplement référence à vraiment creuser dans les bizarreries spécifiques d’un processeur spécifique, pour extraire chaque chute de performance d’un morceau de code?

Le jeu PC "Roller Coaster Tycoon" a été écrit presque entièrement en langage assembleur si je me souviens bien. Alors ... à quel point cela pourrait-il vraiment être transférable?

Était-ce utile?

La solution

Outre le processeur lui-même, il y a bien sûr toujours d'autres considérations: quelles sont les conventions d'appel sur votre plate-forme cible? Comment les valeurs struct sont-elles transmises à d'autres fonctions (par exemple, API)? Quels registres peuvent être effacés par l'appelé? Lesquels sont garantis d'être préservés pour l'appelant? Comment faire un appel système? Quelle est la configuration de la mémoire préparée par le système d'exploitation au démarrage du processus?

Autres conseils

Assemblage de portage, il y a aussi le problème de l'ABI, qui varie d'un système d'exploitation à l'autre. Le portage d’un programme C d’Unix vers Windows (ou même de Linux vers OpenBSD) peut constituer une simple recompilation, mais pour un programme d’assemblage, vous constaterez que certains registres de sauvegarde appelée deviennent des sauvegardes d’appelants ou que les paramètres à virgule flottante sont: passé différemment.

Et ce n’est pas seulement théorique, c’est-à-dire. Enregistrez R2 des versions PowerPC de Linux et Mac OS X. Dans la pratique, le problème peut ne pas être trop grave, par exemple, AMD a publié un "recommandé". ABI en même temps que son jeu d’instructions de 64 bits.

Si vous pensez "PC == Windows", ajouter un assembleur à un programme C ne fait pas beaucoup de mal. Si vous entrez dans le monde Unix, vous aurez beaucoup de processeurs différents: PPC dans la PS3 ou la XBox, anciens Mac et de nombreux serveurs puissants. Pour beaucoup de petits appareils, vous aurez ARM. Les périphériques intégrés (qui représentent aujourd'hui la grande majorité des processeurs installés) utilisent généralement leur propre processeur personnalisé avec un jeu d'instructions spécial.

Ainsi, bien que de nombreux PC puissent aujourd'hui exécuter du code Intel, cela ne représente qu'une petite fraction de tous les processeurs.

Cela dit, le code x86 n’est pas toujours le même. Le code d'assemblage a deux raisons principales: vous devez accéder à des fonctions spéciales (telles que les registres d'interruption) ou vous souhaitez optimiser le code. Dans le premier cas, le code est assez portable. Dans ce dernier cas, chaque processeur est un peu différent. Certains d'entre eux ont SSE . Mais SSE a été bientôt remplacé par SSE2 qui a été remplacé par SSE3 et SSE4. AMD a sa propre marque. Bientôt, il y aura AVX. Au niveau de l'opcode, chacun d'entre eux a un timing légèrement différent sur les différentes versions de CPU.

Pour aggraver les choses, certains opcodes ont des bogues qui sont corrigés dans les étapes spécifiques d’un processeur. De plus, certains opcode sont beaucoup plus rapides sur certaines versions de processeurs que sur d’autres.

Ensuite, vous devrez interfacer ce code d'assemblage avec la partie C. Cela signifie généralement que vous devez soit gérer les ABI .

Vous pouvez donc voir que cela peut devenir arbitrairement complexe.

assembly écrit des instructions directement pour un processeur spécifique, ce qui signifie yeaah si le x86 dure éternellement, votre code est en quelque sorte portable.

Mais même maintenant, les processeurs arm reviennent (c’est-à-dire la nouvelle génération de livre net) et je suis sûr que le processeur ne changera pas l’année prochaine.

Je dirais que le langage d'assemblage n'est pas portable, par sa conception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top