8
votes

Comment l'ONU-PORTABLE est-elle une langue d'assemblage, / vraiment /?

Je comprends qu'écrire quoi que ce soit en matière d'assemblage ou que l'ajout de l'assemblage à tout 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égrais l'assemblage dans un programme C, pourquoi ne serait-il pas encore compilé, peu importe où il est allé?

Cette notion de la transférabilité des Nations Unies est-elle simplement référence lorsque vous VRAIMENT creuser dans les piqûres spécifiques d'un processeur spécifique, afin d'exprimer toutes les gouttes de performances d'un morceau de code?

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


0 commentaires

4 Réponses :


3
votes

Assembly est d'écrire des instructions directement pour un processeur spécifique, ce qui signifie YeaAH si le X86 vit pour toujours votre code est en quelque sorte portable.

Mais même maintenant, le processeur de bras revient (c'est-à-dire un livre net de la prochaine génération) et je suis sûr que si le processeur ne changera pas l'année prochaine.

Je dirais que la langue d'assemblage est par conception non portable.


0 commentaires

16
votes

Outre le processeur lui-même, il existe bien sûr des autres considérations: quelles sont les conventions d'appel sur votre plate-forme cible? Comment les valeurs struct sont-elles transmises à d'autres fonctions (disent: API)? Quels sont les registres de la callee? Qui sont garantis pour être préservés pour l'appelant? Comment faire un appel système? Quelle est la mise en page de mémoire préparée pour vous par le système d'exploitation au début du processus?


4 commentaires

+1, bien que je suppose que l'appelant des conventions et des structures de données n'aurait pas d'importance que votre programme interagit avec d'autres processus. En ce qui concerne la mise en page de la mémoire - Et si vous avez lié votre programme avec la bibliothèque Standard C de la plate-forme cible et utilisée son Malloc () etc.?


@Carson: appeler des conventions pour des fonctions importantes aussi, car vous voudrez probablement pouvoir appeler une fonction écrite en C de l'assemblage mixte, et inversement.


FASM a une bonne portabilité entre Windows et Linux. Je ne connais pas d'autres assembleurs.


Dès que vous accédez à l'API du système d'exploitation, vous interagissez avec d'autres processus. Je ne vois pas comment vous pouvez programmer quoi que ce soit intéressant sans cela.



11
votes

Assemblée de portage, il existe également le problème de l'ABI, qui varie d'OS au système d'exploitation. Portage d'un programme C d'UNIX à Windows (ou même de Linux à OpenBSD) peut être une recompilation simple, mais pour un programme d'assemblage, vous pouvez constater que certaines registres de callee-sauvegarde deviennent appeler-sauvegarder ou que les paramètres de point flottant sont passé différemment.

Et ceci n'est pas seulement théorique, à savoir. Inscrivez-vous R2 des versions PowerPC de Linux et Mac OS X. En pratique, le problème peut ne pas être trop mauvais, par exemple, AMD a publié un ABI «recommandé» en même temps que son ensemble d'instructions 64 bits.


0 commentaires

9
votes

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

Alors, alors que de nombreux PC aujourd'hui pourront exécuter un code Intel, cela ne représente que pour une petite fraction de tous les CPU là-bas.

Cela dit, le code X86 n'est pas toujours le même, non plus. Il y a deux raisons principales du code de montage: vous devez accéder aux fonctionnalités 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. Sur le niveau de fonctionnement, chacun d'entre eux a une synchronisation légèrement différente sur les différentes versions des CPU.

Pour aggraver les choses, certains opcodes ont des bugs qui sont fixés dans des étages spécifiques d'une CPU. En plus de cela, certains opcodes sont beaucoup plus rapides sur certaines versions des processeurs que sur d'autres.

Ensuite, vous devez interfacer ce code de montage avec la partie C. Cela signifie généralement que vous avez besoin de traiter avec ABI Problèmes.

Vous pouvez donc voir que cela peut devenir un complexe arbitrairement.


4 commentaires

+1: Exemple: Linux est supporté par une douzaine, sinon plus, les architectures de la CPU. Un autre exemple est l'écosystème Apple Unix: le code de cacao s'adresse potentiellement x86 sur des Mac récents, PPC sur des macs plus anciens et un bras sur iPhone.


Bien dit - bien que, par "PC", je ne voulais pas dire Windows, mais plutôt un ordinateur personnel moyen (ce que vous êtes susceptible de trouver dans la maison de quiconque, plutôt qu'un serveur, à l'exclusion des Xboxes et des systèmes embarqués, etc.).


Je pense que vous avez voulu dire "PC = Windows", sinon vous ne feriez pas l'hypothèse "Tout est x86 ou x64" :-)


Intel passe à de nombreux efforts pour maintenir la compatibilité à l'envers, y compris les insectes. Si un opcode est buggy, soyez assuré que la spécification sera modifiée et non le comportement futur. Sinon, un bit de mode sera ajouté pour vous permettre d'utiliser l'opcode de Buggy.