67 votes

Pour apprendre l'assemblage, dois-je commencer par le 32 bits ou le 64 bits ?

J'ai vraiment envie d'apprendre l'assemblage. Je suis assez bon en c/c++, mais je veux mieux comprendre ce qui se passe à un niveau inférieur.

Je me rends compte que des questions relatives à l'assemblage ont déjà été posées, mais je cherche simplement à obtenir des conseils adaptés à ma situation :

J'utilise Windows 7 et je ne sais pas comment commencer à travailler avec Assemblage. Dois-je ont de commencer avec x64 parce que j'utilise Windows 7 ? Certaines personnes m'ont dit de commencer par le 32 bits. Comment dois-je procéder ? Qu'est-ce que mon système d'exploitation a à voir avec ma capacité à écrire des assemblages pour "32" ou "64" bits ? En fait, qu'est-ce que l'assemblage "n bit" signifie, où n est un nombre ?


Edit :

Voici quelques liens qui m'ont aidé à me lancer dans l'assemblage ; d'autres personnes qui commencent à peine peuvent les trouver utiles. Je mettrai cette liste à jour au fur et à mesure de mon parcours d'assemblage :)

Note : Au fur et à mesure de mon apprentissage, j'ai décidé de me concentrer sur la programmation avec masm32. Par conséquent, la plupart des ressources ci-dessous se concentrent sur ce sujet.

  • x86 wiki tag (guides pour débutants, manuels de référence, documentation ABI, et plus encore).
  • www.masm32.com
  • WikiBook sur l'assemblage X86
  • WikiBook sur le désassemblage des X86 (idéal pour comprendre certaines conventions, et les bases de la traduction du code de niveau supérieur en assembleur)
  • IDE WinAsm (joue très bien avec masm32)
  • Intro : Assemblée pour Windows (tous les exemples de code sont pour masm32)
  • Liste des interruptions
  • Tutoriel d'assemblage (excellent pour aider à comprendre les concepts fondamentaux)
  • Guide d'assemblage x86
  • Ressources d'optimisation des logiciels d'Agner Fog Le livre comprend de bonnes informations sur les conventions d'appel sur les différentes plates-formes (Windows vs. Linux/OS X), ainsi que de nombreux exemples sur la façon de faire certaines choses efficacement. Ce livre n'est pas idéal pour les débutants, mais il convient parfaitement aux lecteurs de niveau intermédiaire à avancé.

    (Il dispose également d'informations détaillées sur les performances de chaque instruction pour les processeurs Intel et AMD, ce qui est excellent pour une micro-optimisation sérieuse des performances. Certains débutants pourraient vouloir regarder une partie de cela pour commencer à penser à la façon dont les CPUs fonctionnent, et pourquoi vous pourriez faire quelque chose d'une façon plutôt qu'une autre).

1 votes

Envisagez de "programmer à partir de la base".

0 votes

Bonne chance, mec. L'écriture de montage est une vraie corvée. Je n'essaie pas de le décourager, mais c'est une sacrée entreprise.

43voto

Carl Norum Points 114072

Lorsque les gens font référence à 32-bit et 64-bit Assemblage, ils parlent du jeu d'instructions que vous allez utiliser - ils sont aussi parfois appelés Ia32 et x64 dans l'affaire Intel, que je présume que vous demandez. Il y a beaucoup plus de choses qui se passent dans le cas du 64 bits, donc commencer avec le 32 bits est probablement bon ; vous devez juste vous assurer que vous assemblez votre programme avec un assembleur 32 bits dans un binaire 32 bits. Windows saura toujours comment l'exécuter.

Ce que je recommande vraiment pour commencer l'assemblage, c'est quelque chose avec un jeu d'instructions plus simple à maîtriser. Allez apprendre Assemblage MIPS - le spim Le simulateur est génial et facile à utiliser. Si vous voulez vraiment plonger directement dans le monde de l'assemblage Intel, écrivez un petit programme C qui appelle vos routines d'assemblage à votre place ; faire tout le setup et le teardown d'un 'vrai programme' est un gros gâchis, et vous ne pourrez même pas vous y mettre. Il suffit donc d'écrire un wrapper C avec main() et compilez et liez ces fichiers avec les fichiers objets que vous obtenez en écrivant votre code assembleur.

Ne prenez pas l'habitude d'écrire de l'assemblage en ligne dans votre code C - c'est un cauchemar pour la portabilité du code, et il n'y a aucune raison pour cela.

Vous pouvez télécharger tous les Manuels du développeur de logiciels pour les architectures Intel 64 et IA-32 pour commencer.

0 votes

C'est utile, merci. La différence de jeu d'instructions est logique... est-ce la seule différence ? Y a-t-il une différence dans l'exécution d'un programme écrit en 32 bits par rapport à un programme en 64 bits ? Si ce n'est pas le cas, pourquoi les appeler 32 bits/64 bits, plutôt que "jeu d'instructions A" et "jeu d'instructions B", par exemple ?

3 votes

@incrediman, le jeu d'instructions est une différence assez énorme. Les jeux d'instructions ont des noms différents, mais les gens utilisent simplement 32-bit/64-bit comme raccourci. En outre, il existe des conventions d'appel (ABI) différentes entre les deux jeux d'instructions, et même deux ABI 64 bits concurrentes.

0 votes

"Pour l'instant, nous nous contenterons de faire du codage 32 bits, donc les registres internes de l'unité centrale, pour nous, seront de 32 bits. Chaque bit est capable de stocker un 1 ou un 0." ( friedspace.com/assembly/cpuregs1.php ) ... Est-ce une différence supplémentaire entre l'asm 32 et 64 bits ? Sinon, que veut dire cette phrase ? Merci !

33voto

Olof Forshell Points 1754

J'ai commencé à écrire en assembleur en 1977 en prenant le chemin le plus long : d'abord apprendre les opérations de base (et, ou, xor, pas) et les mathématiques octales avant d'écrire des programmes pour le DEC PDP-8/E avec OS/8 et 8k de mémoire. C'était en 1977.

Depuis, j'ai découvert quelques astuces pour apprendre l'assemblage pour des architectures que je ne connais pas. Il y en a eu quelques-unes : 8080/8085/Z80, x86, 68000, VAX, 360, HC12, PowerPC et V850. J'écris rarement des programmes autonomes, ce sont généralement des fonctions qui sont liées au reste du système qui est généralement écrit en C.

Je dois donc tout d'abord être capable de m'interfacer avec le reste du logiciel, ce qui nécessite d'apprendre le passage des paramètres, la disposition de la pile, la création du cadre de la pile, la position des paramètres, la position des variables locales, la suppression du cadre de la pile, les valeurs renvoyées, le retour et le nettoyage de la pile. La meilleure façon de le faire est d'écrire une fonction qui appelle une autre fonction en C et d'examiner le listing de code généré par le compilateur.

Pour apprendre le langage d'assemblage lui-même, j'écris du code simple, en voyant ce que le compilateur génère et en le parcourant d'un seul pas dans un débogueur brut. J'ai les manuels d'instructions à portée de main pour pouvoir rechercher les instructions dont je ne suis pas sûr.

Une bonne chose à connaître (en plus de la manipulation de la pile mentionnée précédemment) est la façon dont le compilateur génère le code machine à partir d'une certaine construction du langage de haut niveau. Une telle séquence est la façon dont les tableaux/structures indexés sont traduits en pointeurs. Une autre séquence est la séquence de base du code machine pour les boucles.

Alors, qu'est-ce qu'un "débogueur brut" ? Pour moi, c'est un débogueur qui fait partie d'un paquet de développement simple et qui n'essaie pas de me protéger du matériel comme le(s) débogueur(s) visuel(s). Il me permet de passer facilement du débogage du code source au débogage de l'assemblage. Il démarre également rapidement à partir de l'IDE de développement. Il n'a pas trois mille fonctionnalités, plutôt trente, et ce sont celles que vous utiliserez 99,9 % du temps. Le paquet de développement fait généralement partie d'un programme d'installation dans lequel vous cliquez une fois sur l'approbation de la licence, une fois sur l'approbation de la configuration par défaut (n'aimez-vous pas que quelqu'un ait pensé à faire ce travail à votre place ?

J'ai un environnement de développement simple préféré pour x86-32 (IA-32) et c'est OpenWatcom. Vous pouvez le trouver à l'adresse openwatcom.org.

Je suis assez novice en matière de x86-64 (AMD64), mais la transition semble simple (un peu comme lorsqu'on passe de x86-16 à x86-32) avec quelques astuces supplémentaires comme les registres supplémentaires r8 à r15 et le fait que les registres principaux ont une largeur de 64 bits. Je suis récemment tombé sur un environnement de développement pour XP/64, Vista/64 et 7/64 (qui fonctionne probablement aussi pour les systèmes d'exploitation serveurs) et il s'appelle Pelles C (pellesc.org). Il est écrit et maintenu par un certain Pelle Orinius en Suède et d'après les quelques heures que j'ai passées avec, je peux dire qu'il est destiné à devenir mon préféré pour x86-64. J'ai essayé les paquets Visual Express (ils installent tellement de déchets - savez-vous combien de désinstallations vous devez faire ensuite ? plus de 20) et j'ai aussi essayé de faire fonctionner gcc d'un endroit avec un IDE (eclipse ou autre) d'un autre.

Une fois que vous êtes arrivé jusqu'ici et que vous rencontrez une nouvelle architecture, vous pourrez passer une heure ou deux à regarder le listing généré et après cela, vous saurez à peu près à quelle autre architecture elle ressemble. Si les constructions d'index et de boucles vous semblent étranges, vous pouvez examiner le code source qui les génère et peut-être aussi le niveau d'optimisation du compilateur.

Je pense que je dois vous avertir qu'une fois que vous aurez pris le coup de main, vous remarquerez qu'aux bureaux voisins, à la machine à café, dans les réunions, dans les forums et dans beaucoup d'autres endroits, il y aura des individus qui attendront pour vous mépriser, se moquer de vous, vous lancer des citations incomplètes et vous donner des conseils non informés/incompétents en raison de votre intérêt pour l'assemblée. Je ne sais pas pourquoi ils font cela. Peut-être sont-ils eux-mêmes des programmeurs assembleurs ratés, peut-être ne connaissent-ils que l'OO (C++, C# et Java) et n'ont-ils simplement aucune idée de ce qu'est l'assembleur. Peut-être que quelqu'un qu'ils "connaissent" (ou qu'un de leurs amis connaît) qui est "vraiment bon" peut avoir lu quelque chose dans un forum ou entendu quelque chose lors d'une conférence et peut donc délivrer une vérité absolue sur la raison pour laquelle l'assembleur est une perte de temps complète. Il y en a beaucoup ici sur stackoverflow.

0 votes

Excellente réponse (merci de l'avoir ajoutée malgré l'ancienneté de la question), mais vous n'aviez pas besoin d'en faire un wiki communautaire - vous méritez une certaine reconnaissance ! :)

2 votes

Merci Cam. J'ai senti que la question avait besoin de quelque chose de plus... un mode d'emploi pratique !

3voto

Hassan Syed Points 10746

Obtenez IDA pro. C'est le meilleur moyen de travailler avec l'assemblage.

Personnellement, je ne vois pas une grande différence entre 32 et 64 bits. Il ne s'agit pas des bits mais du jeu d'instructions. Lorsque vous parlez d'assemblage, vous parlez de jeux d'instructions. Peut-être veulent-ils dire qu'il est préférable d'apprendre à partir d'un jeu d'instructions 32 bits. Cependant, si tel est votre objectif, je vous suggère les livres de Donald Knuth sur les algorithmes - ils enseignent les algorithmes en termes d'assemblage de jeux d'instructions 7 bits :D

Pour les questions de portabilité, je suggère qu'au lieu de l'assemblage en ligne, vous appreniez à utiliser les intrinsèques du compilateur -- ce sera la meilleure optimisation pour les optimisations non intégrées. :D

1 votes

D'après ce que j'ai lu, c'est un désassembleur... donc, écrire/coder du code en langage assembleur n'est pas possible, n'est-ce pas ? Si c'est le cas, ce n'est qu'une demi-réponse.

1 votes

Travailler avec l'assembleur de nos jours (même dans le domaine de l'embarqué) consiste à faire des ajustements au code généré par un compilateur C/C++. IDA rend ce travail aussi facile que possible.

0 votes

C'est possible, mais cela ne répond pas vraiment à ma question initiale :)

1voto

AndiDog Points 28417

mais veulent mieux comprendre ce qui se passe à un niveau inférieur

Si vous voulez vraiment savoir tout ce qui se passe à un niveau inférieur sur les processeurs/systèmes x86/x64, je vous recommande vraiment de commencer par les bases, c'est-à-dire le code en mode réel 286/386. Par exemple, dans le code 16 bits, vous êtes obligé d'utiliser la segmentation de la mémoire, ce qui est un concept important à comprendre. Les systèmes d'exploitation 32 bits et 64 bits d'aujourd'hui sont toujours lancés en mode réel, puis basculent vers/entre les modes pertinents.

Mais si vous êtes intéressé par le développement d'applications/algorithmes, vous n'avez peut-être pas envie d'apprendre tous les trucs de bas niveau du système d'exploitation. Au lieu de cela, vous pouvez commencer directement avec du code x86/x64, en fonction de votre plate-forme. Notez que le code 32 bits fonctionnera également sur Windows 64 bits, mais pas l'inverse.

3 votes

Le démarrage n'est pas la seule façon d'interagir avec un système à un niveau inférieur ; je pense que l'écriture de l'assemblage natif pour les programmes du système d'exploitation est une bonne façon de commencer. L'écriture et le débogage des systèmes de démarrage ne sont pas à la portée des cœurs sensibles.

3 votes

Comprendre les segments de 16 bits est à peu près aussi utile que d'apprendre comment fonctionnent les chiffres romains. Et pour ce qui est de commencer en mode réel à démarrer votre propre système d'exploitation, il vous faudra quelques années d'études, à moins qu'il ne s'agisse simplement d'imprimer "Le BIOS m'a transmis ces valeurs de registre à l'écran xxxx xxxx". Les trucs de bas niveau comme la lecture/écriture des ports matériels dans les pilotes de périphériques seraient une bonne utilisation du code assembleur même si vous n'êtes pas un génie de l'assembleur.

1 votes

La segmentation en mode long x86-64 est principalement vestigiale. Pour la plupart des registres de segment, la base est fixée à 0, donc la seule option est une mémoire plate (comme tous les principaux systèmes d'exploitation utilisent en mode 32 bits). Apprendre la segmentation 16 bits après vous comprenez le modèle de mémoire plate plus facile à comprendre peut aider à comprendre comment fs ou gs sont utilisés pour le stockage local des threads dans les systèmes modernes. Mais je vous déconseille d'essayer d'apprendre cela en premier. Même en interne, les CPU modernes traitent de manière spéciale le cas segment-base=0, et ont par ailleurs une latence plus élevée pour les charges. Donc, même en interne, la segmentation ne se produit pas.

0voto

theking2 Points 133

Commencer à programmer en C (et non en C++ ou C#) vous permettra d'acquérir une compréhension de base de ce qui est nécessaire pour "tout faire soi-même", comme les registres, la pile et le traitement des données. J'ai fait un master en informatique et l'un de mes sujets préférés est la construction de compilateurs (oui yacc et lex !) qui m'a aidé à comprendre tous les langages de plus haut niveau à un niveau intime et profond. Je chéris toujours ces moments où je définissais mon propre langage et le compilais en constructions de bas niveau. En effet, j'ai conçu un langage orienté objet à exécuter sur un processeur virtuel.

Donc : il n'y a pas de raccourcis pour apprendre l'assembleur. Cela peut être fastidieux. Mais très satisfaisant.

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