web-dev-qa-db-fra.com

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

Je veux vraiment apprendre l'Assemblée. Je suis assez bon en c/c ++, mais je veux une meilleure compréhension de ce qui se passe à un niveau inférieur.

Je me rends compte que des questions liées à l'Assemblée ont déjà été posées, mais je cherche juste une direction particulière à ma situation:

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


Éditer:

Voici quelques liens qui m'ont aidé à démarrer avec Assembly; d'autres qui ne font que commencer peuvent les trouver utiles. Je continuerai de mettre à jour cette liste au fur et à mesure que je continuerai mon voyage d'assemblage :)

Remarque: Comme je l'ai appris, j'ai décidé de me concentrer sur la programmation avec masm32. Par conséquent, la plupart des ressources ci-dessous se concentrent sur cela.

  • x86tag wiki (guides pour débutants, manuels de référence, documentation ABI, etc.)
  • www.masm32.com
  • WikiBook d'assemblage X86
  • X86 Dissassembly WikiBook (idéal pour comprendre certaines conventions et les bases de la façon dont le code de niveau supérieur se traduit par Assembly)
  • WinAsm IDE (joue bien avec masm32)
  • Intro: Assembly for Windows (tous les exemples de code sont pour masm32)
  • Liste des interruptions
  • Tutoriel d'assemblage (idéal pour aider à comprendre les concepts de base)
  • Guide d'assemblage x86
  • Ressources d'optimisation logicielle d'Agner Fog , y compris quelques bonnes choses sur les conventions d'appel sur différentes plates-formes (Windows vs Linux/OS X), ainsi que de nombreux exemples sur la façon de faire des choses spécifiques efficacement. Pas génial pour les débutants, mais idéal pour les lecteurs intermédiaires à avancés.

    (Il a également des informations détaillées sur les performances de chaque instruction pour les processeurs Intel et AMD, excellentes pour une micro-optimisation sérieuse des performances. Certains débutants voudront peut-être examiner certaines de ces données pour commencer à réfléchir au fonctionnement des processeurs et pourquoi vous pourriez faire quelque chose au lieu d'un autre.)

55
Cam

Lorsque les gens se réfèrent à l'assemblage 32-bit Et 64-bit, Ils parlent du jeu d'instructions que vous utiliserez - ils sont aussi parfois appelés Ia32 Et x64 dans l'affaire Intel, dont je suppose que vous parlez. Il y a beaucoup plus de choses dans le cas 64 bits, donc commencer avec 32 bits est probablement bon; il vous suffit de 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 avec Assembly serait quelque chose avec un jeu d'instructions plus simple à maîtriser. Allez apprendre MIPS Assembly - le simulateur spim est génial et facile à utiliser. Si vous voulez vraiment plonger directement dans le monde Intel Assembly, écrivez-vous un petit programme C qui appelle vos routines Assembly pour vous; faire toute la configuration et le démontage d'un "vrai programme" est un gros gâchis, et vous ne pourrez même pas commencer là-bas. Il suffit donc d'écrire un wrapper C avec main(), et de le compiler et de le lier avec les fichiers objets que vous obtenez en écrivant votre code d'assembly.

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

Vous pouvez télécharger tous les Intel 64 et IA-32 Architectures Software Developer's Manuals pour commencer.

34
Carl Norum

J'ai commencé à écrire Assembly en 1977 en prenant le long chemin: apprendre d'abord 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 à assembler des architectures que je ne connais pas. Cela fait quelques-uns: 8080/8085/Z80, x86, 68000, VAX, 360, HC12, PowerPC et V850. J'écris rarement des programmes autonomes, ce sont généralement des fonctions liées au reste du système qui sont généralement écrites en C.

Donc, tout d'abord, je dois pouvoir 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, les positions des paramètres, les positions 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 procéder consiste à écrire une fonction qui appelle une autre fonction en C et à examiner la liste de code générée 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 une seule étape dans un débogueur brut. J'ai les manuels du jeu d'instructions à proximité afin de pouvoir rechercher des instructions dont je ne suis pas sûr.

Une bonne chose à savoir (en plus de la gestion de la pile mentionnée précédemment) est de savoir comment le compilateur génère du code machine en fonction d'une certaine construction de langage de haut niveau. L'une de ces séquences est la façon dont les tableaux/structures indexés sont traduits en pointeurs. Un autre est la séquence de code machine de base pour les boucles.

Alors, qu'est-ce qu'un "débogueur brut?" Pour moi, c'est un débogueur qui fait partie d'un package de développement simple et qui n'essaie pas de me protéger du matériel comme le ou les débogueurs Visual. Dans celui-ci, je peux facilement basculer entre le débogage source et l'assemblage. Il démarre également rapidement à partir de l'IDE de développement. Il n'a pas trois mille fonctionnalités, plus probablement trente et ce seront celles que vous utiliserez 99,9% du temps. Le package de développement fera généralement partie d'un programme d'installation où vous cliquez une fois pour l'approbation de la licence, une fois pour l'approbation de la configuration par défaut (ne l'aimez-vous pas quand quelqu'un a pensé et fait ce travail pour vous?) Et une dernière fois pour l'installation .

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

Je suis assez nouveau sur x86-64 (AMD64) mais la transition semble simple (un peu comme lors du passage de x86-16 à x86-32) avec quelques gadgets supplémentaires tels que les registres supplémentaires r8 à r15 et que les registres principaux sont 64 bits large. J'ai récemment rencontré un environnement de développement pour XP/64, Vista/64 et 7/64 (fonctionne probablement aussi pour le système d'exploitation du serveur: s) et il s'appelle Pelles C (pellesc.org). Il est écrit et maintenu par un 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 packages Visual Express (ils installent tellement de déchets - savez-vous combien de désinstallations vous devez faire par la suite? Plus de 20) et j'ai également essayé d'obtenir gcc d'un endroit pour travailler avec un IDE (Eclipse ou autre) d'un autre.

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

Je pense que je devrais vous avertir qu'une fois que vous aurez compris, vous remarquerez que dans les bureaux à proximité, à la machine à café, dans les réunions, dans les forums et dans beaucoup d'autres endroits, des personnes vous attendront pour vous mépriser, vous moquer de vous, lancez des citations incomplètes et donnez des conseils non informés/incompétents en raison de votre intérêt pour l'Assemblée. Pourquoi ils font ça, je ne sais pas. Peut-être qu'ils sont eux-mêmes des programmeurs d'assemblages ratés, peut-être qu'ils ne connaissent que OO (C++, C # et Java) et n'ont tout simplement pas la moindre idée de ce qu'est l'assembleur. Peut-être 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 fournir une vérité absolue sur les raisons pour lesquelles l'Assemblée est une perte de temps totale. Il y a beaucoup de les ici à stackoverflow.

22
Olof Forshell

Get IDA pro. Ce sont les genoux des abeilles pour travailler avec Assembly.

Personnellement, je ne vois pas beaucoup de différence entre 32 bits 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 qu'ils impliquent qu'il est préférable d'apprendre un jeu d'instructions 32 bits. Cependant, si tel est votre objectif, je suggère des livres de Donald Knuths sur les algorithmes - ils enseignent les algorithmes en termes de jeu d'instructions 7 bits. Assemblage: D

Pour les problèmes 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. :RÉ

3
Hassan Syed

Commencer à programmer C, (pas C++ ou C #) vous aidera à avoir une compréhension de base de ce qui est nécessaire pour `` tout faire vous-même '', comme le registre, le cadre de 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 niveau supérieur dans un niveau intime profond. Je chéris toujours ces moments en définissant mon propre langage et en le compilant 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 raccourci pour apprendre l'assembleur. Cela peut être fastidieux. Mais très satisfaisant.

0
theking2

mais veulent une meilleure compréhension de 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 recommanderais 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, un concept important à comprendre. Les systèmes d'exploitation 32 bits et 64 bits d'aujourd'hui sont toujours démarrés en mode réel, puis basculent vers/entre les modes concernés.

Mais si vous êtes intéressé par le développement d'applications/d'algorithmes, vous ne voudrez peut-être pas apprendre tous les éléments du système d'exploitation de bas niveau. Au lieu de cela, vous pouvez commencer tout de suite avec du code x86/x64, selon votre plate-forme. Notez que le code 32 bits s'exécutera également sur Windows 64 bits, mais pas l'inverse.

0
AndiDog