Existe-t-il un livre canonique sur l'assemblage x86? [fermé]

25

Il y a beaucoup de livres sur l'assemblage. Cependant, ils traitent généralement des ISA dont je ne me soucie pas, comme MIPS ou ARM. Je ne m'occupe pas de ces architectures; il n'y a aucune raison pour moi d'essayer de les apprendre.

Mais les livres d'assemblage x86 semblent ... inexistants.

Disons par exemple que j'essaie de construire un compilateur de jouets générant des fichiers exécutables Windows Portable.

Existe-t-il un livre qui constitue la norme de facto pour décrire les meilleures pratiques, les méthodologies de conception et d'autres informations utiles sur l'assemblage x86? Qu'en est-il de ce livre qui le rend spécial?

Billy ONeal
la source
Quelle est votre expérience en assemblage? Avez-vous déjà essayé d'utiliser GCC sans optimisation pour compiler des programmes C simples en assembleur, puis reconstituer le code en un programme C?
Brian
10
@Brian: Il faudrait que je connaisse l'assemblage avant de pouvoir le faire.
Billy ONeal
J'ai vu une copie du jeu d'instructions x86. Il s'agit de 2 volumes, et probablement le plus grand livre que j'aie jamais vu. Amusez-vous :)
AngryBird
2
Billy, si vous ne connaissez pas d'assemblage du tout, alors n'importe lequel d'entre eux serait plutôt bien de commencer pour obtenir les idées générales. L'assemblage est extrêmement proche de l'architecture, de sorte que les instructions d'assemblage reflètent grandement les conceptions spécifiques à l'architecture. J'ai commencé avec l'assemblage x86 et j'ai lu le «langage d'assemblage pour les ordinateurs Intel» de Kip Irvine. Le livre était en fait associé à un cours en ligne dans un collège communautaire. Je ne sais pas quel type d'apprenti vous êtes, mais je trouve que l'enseignement guidé fonctionne le mieux pour l'apprentissage.
Brian
@Brian: Que voulez-vous dire par "l'un d'eux"? Je ne comprends pas ce qu'est "eux" - un livre? Un assembleur? Tout ISA? J'ai déjà joué avec l'assembleur MIPS; Je ne trouve cependant rien sur x86.
Billy ONeal

Réponses:

18

J'ai utilisé le langage d'assemblage pour les processeurs x86 comme manuel lorsque j'étais au collège et je l'ai trouvé très facile à comprendre. J'ai l'ancienne quatrième édition et je l'ai comparée à la sixième édition et je n'ai pas remarqué beaucoup de changement, vous pouvez donc probablement acheter une ancienne copie à bon marché. Les gens se plaignent de son utilisation de sa propre bibliothèque pour les E / S, mais il vous explique comment procéder de la manière "difficile" dans les derniers chapitres.

dboss
la source
1
Très bon livre!
Coder
J'ai lu la 5e édition du livre d'Irvine quand elle était intitulée "Langage d'assemblage pour les ordinateurs Intel". :)
Brian
1
Je pense que c'est une assez mauvaise suggestion, car la plupart de la deuxième édition est spécifique au système ésotérique de haut niveau de l'auteur, qui est essentiellement une version bâtarde de C. Je n'ai jamais lu la première édition publiée. La version dos que vous pouvez trouver sur son site gratuitement et qui n'a jamais été publiée est une bonne lecture. Il est également environ 50% plus long et ne manque de rien sur HLA (ce qui est une perte de temps totale ).
Evan Carroll,
1
@EvanCarroll, je suis confus. Vous avez modifié le lien vers le mauvais livre, puis critiqué le livre vers lequel vous avez modifié le lien. C'était involontaire?
Merlyn Morgan-Graham
1
totalement mon erreur. @ MerlynMorgan-Graham bien pour vous à la fois pour l'attraper et le corriger.
Evan Carroll
9

L'art de la programmation d'assemblage est une excellente ressource qui en dit long sur la programmation x86.

La documentation ABI x64 est également utile. J'essayais de trouver un lien vers la version qui était sur le site Web d'AMD, mais je n'arrive plus à le trouver, donc je suppose que celui-ci devra le faire.

Au lieu d'essayer d'écrire une application complète à partir de zéro dans l'assembly, écrivez plutôt la plupart en C (ou tout autre langage compilé vraiment), puis appelez un morceau de code d'assembly à partir de cette. Une fois que vous avez fait cela, inversez-le, écrivez un programme d'assemblage et appelez quelques fonctions C à partir de cela.

Modifier: correction d'une faute de frappe.

Orclev
la source
1
Autre suggestion: écrivez un programme simple en C, compilez-le en assembleur, nettoyez-le pour que votre assembleur puisse l'assembler, puis améliorez la version d'assemblage. C'est un bon moyen d'obtenir rapidement des fonctionnalités minimales (lire à partir du clavier, écrire sur la console).
TMN
4

Un très bon livre pour apprendre l'assemblage x86 est Pentium Processor Optimization Tools . Bien que l'objectif principal du livre soit l'optimisation du code d'assemblage, il enseigne l'assemblage Pentium en cours de route et constitue également un bon livre de référence.

Il est épuisé depuis longtemps mais n'est pas difficile à trouver utilisé.

Il est livré avec une disquette contenant un "optimiseur de code d'assemblage". Il n'optimise pas réellement votre code, mais produit une liste commentée qui indique où se trouvent les inefficacités telles que les blocages de pipeline.

L'outil fourni avec un livre est une version limitée d'un produit plus fonctionnel que la société de l'auteur vendait, mais pour des raisons que je ne connais pas, il a longtemps cessé ses activités. Je ne sais pas pourquoi - je pense qu'un tel outil se vendrait comme des petits pains.

x86 en général est un sujet très complexe car il existe de nombreuses variantes prises en charge par différents modèles de microprocesseurs. Une fois que vous connaissez les bases, vous voudrez consulter les livres de données d'Intel ou d'AMD pour la puce précise que vous ciblez. Malheureusement, le code qui s'exécute rapidement sur un modèle de CPU peut ne pas être aussi rapide sur une autre puce.

Mike Crawford
la source
Pas vraiment pour la performance; je veux juste pouvoir générer des binaires. Jettera toujours un coup d'oeil :)
Billy ONeal
2
Vous devrez également apprendre à utiliser un assembleur particulier, pas seulement les opcodes d'assemblage. Chaque assembleur fait les choses de manière totalement différente. Si vous allez écrire beaucoup de code assembleur, utilisez masm car il a été développé avec des codeurs humains à l'esprit. Si vous voulez simplement écrire de petits extraits d'assemblage en ligne, vous pouvez utiliser gcc avec GNU comme assemblage en ligne (également appelé gaz). La syntaxe GNU as est complètement différente de celle de masm. Comme cela a été écrit principalement pour être utilisé comme back-end pour gcc, pour faire la génération de code exécutable, et ne fournit donc pas beaucoup des fonctionnalités que les codeurs humains veulent.
Mike Crawford
1

Pourquoi ne pas essayer le wikibook - http://en.wikibooks.org/wiki/X86_Assembly . Il donne un bon début d'introduction au langage d'assemblage.

Le plus dur à propos de l'assemblage est de réaliser à quel point c'est simple et que vous devez rester avec cette simplicité.

Philip Oakley
la source