Pour apprendre l’assemblage – devrais-je commencer avec 32 bits ou 64 bits?

Je veux vraiment apprendre le assembly. Je suis plutôt bon en c / c ++, mais je veux mieux comprendre 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 simplement une orientation particulière à ma situation:

Je suis sous Windows 7 et je ne comprends pas comment commencer à travailler avec l’assemblage. Dois-je commencer avec x64 parce que je suis sous Windows 7? Certaines personnes ont dit «Commencez par 32 bits en premier» – comment puis-je faire cela? Qu’est-ce que mon système d’exploitation a à faire avec ma capacité à écrire l’assemblage pour les bits ’32’ ou ’64’. En fait, qu’est-ce qu’un assemblage «n bit», où n est un nombre?


Modifier:

Voici quelques liens qui m’ont aidé à démarrer avec l’assemblage. d’autres qui ne font que commencer peuvent les trouver utiles. Je continuerai à mettre à jour cette liste pendant que je continue mon voyage d’assemblage 🙂

Note: Comme j’ai appris, j’ai décidé de me concentrer sur la programmation avec masm32. C’est pourquoi la plupart des ressources ci-dessous se concentrent sur cela.

  • wiki de balises x86 (guides pour débutants, manuels de référence, documentation ABI, etc.)
  • www.masm32.com
  • WikiBook Assemblée X86
  • WikiBook X86 Dissassembly (idéal pour comprendre certaines conventions et les bases de la traduction de code de niveau supérieur en assembleur)
  • WinAsm IDE (joue bien avec masm32)
  • Intro: Assembly pour Windows (tous les exemples de code sont pour masm32)
  • Liste des interruptions
  • Tutoriel d’assemblage (idéal pour comprendre les concepts de base)
  • x86 Guide de assembly
  • Les ressources d’optimisation du logiciel Agner Fog , y compris des éléments utiles sur les conventions d’appel sur différentes plates-formes (Windows ou Linux / OS X), ainsi que de nombreux exemples sur la manière de gérer efficacement certaines tâches. Pas génial pour les débutants, mais idéal pour les lecteurs de niveau intermédiaire à avancé.

    (Il a également des informations détaillées sur les performances de chaque instruction pour les processeurs Intel et AMD, ce qui est excellent pour la micro-optimisation des performances sérieuses. Certains débutants voudront peut-être commencer à penser au fonctionnement des processeurs chemin au lieu d’un autre.)

Lorsque les utilisateurs se réfèrent à l’assemblage 32-bit et 64-bit , ils parlent du jeu d’instructions que vous utiliserez – ils sont parfois appelés Ia32 et x64 dans le boîtier Intel, et je suppose que vous vous posez la question. 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 fichier binary 32 bits. Windows saura toujours comment l’exécuter.

Ce que je recommande vraiment pour commencer avec l’assemblage serait quelque chose avec un jeu d’instructions plus simple à prendre en main. Allez apprendre l’ assemblage MIPS – le simulateur de spim est excellent et facile à utiliser. Si vous voulez vraiment plonger directement dans le monde de l’assemblage Intel, écrivez vous-même un petit programme C qui appelle vos routines d’assemblage pour vous; Faire toute la configuration et le déassembly pour un «vrai programme» est un gros désordre, et vous ne pourrez même pas y démarrer. Il suffit donc d’écrire un wrapper C contenant main() , puis de le comstackr et de le lier aux fichiers d’object que vous obtenez en écrivant votre code d’assemblage.

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

Vous pouvez télécharger tous les manuels du développeur du logiciel Intel 64 et IA-32 Architectures pour commencer.

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

Depuis lors, j’ai découvert quelques astuces pour apprendre l’assemblage des architectures que je ne connais pas bien. Quelques exemples: 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 rest du système qui sont généralement écrites en C.

Tout d’abord, je dois pouvoir interfacer avec le rest du logiciel, ce qui nécessite d’apprendre le passage des parameters, la disposition de la stack, la création du cadre de la stack, les positions des variables locales, . La meilleure façon de procéder consiste à écrire une fonction qui appelle une autre fonction dans C et à examiner la liste de codes générée par le compilateur.

Pour apprendre le langage d’assemblage lui-même, j’écris un code simple, en visualisant ce que le compilateur génère et en le parcourant dans un débogueur brut. J’ai les manuels d’instructions à scope de main pour pouvoir consulter les instructions dont je ne suis pas certain.

Une bonne chose à savoir (en plus de la manipulation de la stack mentionnée précédemment) est la manière dont 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. Une 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 simple package de développement et qui ne tente pas de me protéger du matériel tel que le ou les débogueurs Visual. Je peux facilement basculer entre le débogage source et l’assemblage. Il démarre également rapidement depuis 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 fait généralement partie d’un programme d’installation sur lequel vous cliquez une fois pour l’approbation de la licence, une fois pour approuver la configuration par défaut (ne l’aimez-vous pas lorsque quelqu’un a pensé et fait ce travail pour vous?) .

J’ai un environnement de développement simple préféré pour x86-32 (IA-32) et c’est OpenWatcom. Vous pouvez le trouver à 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 trucs supplémentaires tels que les registres supplémentaires r8 à r15 et les registres principaux 64 bits large. Je viens tout juste de parcourir un environnement de développement pour XP / 64, Vista / 64 et 7/64 (probablement aussi pour le système d’exploitation du serveur) et s’appelle Pelles C (pellesc.org). Il est écrit et maintenu par un certain Pelle Orinius en Suède et des 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 fichiers indésirables – savez-vous combien de désinstallations vous devez faire par la suite? Plus de 20) et essayez de faire en sorte que gcc fonctionne avec un IDE (eclipse ou autre chose) ) D’un autre.

Une fois que vous êtes arrivé si loin et que vous rencontrez une nouvelle architecture, vous pourrez passer une heure ou deux à regarder la liste générée et, par la suite, vous savez à quoi ressemble l’architecture. Si les constructions d’index et de boucles semblent étranges, vous pouvez regarder 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 le problème, vous remarquerez que dans les bureaux proches, à la machine à café, dans les réunions, dans les forums et dans de nombreux autres endroits, des personnes attendent de vous mépriser. Vous, lancez des citations incomplètes sur vous et donnez des conseils non informés / incompétents en raison de votre intérêt pour le rassemblement. Pourquoi ils font ça je ne sais pas. Peut-être qu’ils sont eux-mêmes des programmeurs d’assemblage défaillants, 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 que quelqu’un “qui sait” (ou qu’un ami connaît) qui est “vraiment bon” a peut-être lu quelque chose dans un forum ou entendu quelque chose lors d’une conférence et peut donc dire que l’assemblage est un gaspillage de temps. Il y en a beaucoup ici au stackoverflow.

Obtenez IDA pro. Ce sont les genoux des abeilles pour travailler avec l’assemblage.

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 de assembly, vous parlez de jeux d’instructions. Peut-être sous-entendent-ils qu’un jeu d’instructions 32 bits est préférable d’apprendre. Cependant, si tel est votre objective, je suggère des livres sur les algorithmes de Donald Knuth – ils enseignent des algorithmes en termes d’ensemble de jeux d’instructions à 7 bits: D

Pour les problèmes de portabilité, je suggère qu’au lieu d’assembler en ligne, vous apprendrez à utiliser les éléments insortingnsèques du compilateur – ce sera la meilleure optimisation pour les optimisations non incorporées. :RÉ

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 vous recommande vraiment de commencer par les bases, à savoir le code de mode réel 286/386. Par exemple, en code 16 bits, vous devez utiliser la segmentation de la mémoire, un concept important à comprendre. Les systèmes d’exploitation 32 bits et 64 bits actuels 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 / algorithmes, vous ne voudrez peut-être pas apprendre tous les trucs de système d’exploitation de bas niveau. Au lieu de cela, vous pouvez commencer immédiatement avec le code x86 / x64, selon votre plate-forme. Notez que le code 32 bits sera également exécuté sur Windows 64 bits, mais pas l’inverse.