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

je veux vraiment apprendre l'assemblage. Je suis assez bon en c/c++, mais veulent 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 qui est particulière à ma situation:

j'exécute windows 7, et je suis confus sur la façon dont je devrais commencer à travailler avec l'assemblage. Est-ce que je a pour commencer avec x64 parce que je suis fonctionnant sous windows 7? Certaines personnes ont dit 'commencer avec 32 bits d'abord" - comment puis-je faire? Qu'est ce que mon système d'exploitation ont à voir avec ma capacité à écrire de l'assemblée '32' ou '64' peu. En fait, que signifie "N bit" assembly, où n est un nombre??


Edit:

voici quelques liens qui m'ont aidé à commencer avec assembly; d'autres qui ne font que commencer peuvent les trouver utiles. Je vais continuer à mettre à jour ce la liste que je continue sur ma assemblée voyage :)

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

  • tag wiki (guides de débutant, manuels de référence, documentation ABI, et plus.)
  • www.masm32.com
  • X86 Assemblée WikiBook
  • X86 Dissassembly WikiBook (grand pour comprendre certaines conventions, et les bases de la façon dont le code de niveau supérieur se traduit en assemblée)
  • WinAsm IDE (joue bien avec masm32)
  • Intro: Assemblée Windows (tous les exemples de code sont pour masm32)
  • liste des Interruptions
  • tutoriel D'assemblage (excellent pour aider à comprendre les concepts de base)
  • x86 Guide de montage
  • Agner Fog's Software optimization resources , y compris de bonnes choses sur l'appel de conventions sur différentes plateformes (Windows vs. Linux/OS X), ainsi que beaucoup d'exemples de la façon de faire des choses spécifiques efficacement. Pas génial pour les débutants, mais grand pour l'intermédiaire à avancé lecteurs.

    (il a également des informations détaillées sur les performances pour chaque instruction pour les processeurs Intel et AMD, excellent pour la micro-optimisation des performances. Certains débutants pourraient vouloir regarder certains de cela pour commencer à penser à la façon dont les CPU fonctionnent, et pourquoi vous pourriez faire quelque chose d'une manière plutôt que d'une autre.)

49
demandé sur Cam 2010-02-28 21:19:35

4 réponses

quand les gens font référence à 32-bit et 64-bit assemblée, ils parlent de quel ensemble d'instructions vous allez utiliser - ils sont aussi parfois appelés Ia32 et x64 dans le cas Intel, que je présume que vous demandez. Il y a beaucoup plus dans le cas de 64 bits, donc commencer avec 32 bits est probablement bon; vous avez juste besoin 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 l'assemblage serait quelque chose avec un ensemble d'instructions plus simple pour obtenir une poignée sur. Aller apprendre MIPS assemblée - le spim simulateur est grand et facile à utiliser. Si vous voulez vraiment plonger directement dans le monde de l'assemblage Intel, écrivez-vous un petit programme C qui appelle vos routines d'assemblage pour vous; faire toute la configuration et démontage pour un "vrai programme" est un grand désordre, et vous n'aurez même pas être en mesure d'obtenir commencé. Il suffit donc d'écrire un "C wrapper" avec main() dedans, et de compiler et lier avec les fichiers d'objet que vous obtenez en écrivant votre code d'assemblage.

S'il vous plaît ne prenez pas l'habitude d'écrire inline assembly 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 la totalité des manuels de développement de logiciels Intel 64 et IA-32 Architectures pour commencer.

34
répondu Carl Norum 2010-02-28 18:28:05

j'ai commencé à écrire assemblée en 1977 en prenant le long chemin: premier apprentissage 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 lors, j'ai découvert quelques astuces sur la façon d'apprendre l'assemblage pour des architectures que je ne connais pas. Il a été un peu: 8080/8085 / Z80, x86, 68000, VAX, 360, HC12, PowerPC et V850. J'écris rarement des programmes autonomes, c'est souvent les fonctions qui sont liées avec le reste du système qui est généralement écrit en C.

donc tout d'abord je dois être capable de m'interfacer avec le reste du logiciel qui nécessite l'apprentissage du passage des paramètres, de la disposition de la pile, de la création du cadre de la pile, des positions des paramètres, des positions des variables locales, du rejet du cadre de la pile, des valeurs retournées, du retour et du 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 la liste de code généré par le compilateur.

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

une bonne chose à savoir (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 de langage de haut niveau. Un une telle séquence est la façon dont les tableaux/structures indexés sont traduits en pointeurs. Une autre 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 est partie d'un simple paquet de développement et qui n'essaie pas de me protéger du matériel comme le Visual debugger(s). Je peux facilement basculer entre le débogage source et le débogage d'assemblage. Il commence aussi rapidement de l'intérieur de L'IDE de développement. Il n'a pas trois mille fonctionnalités, plus susceptibles de trente et ceux-ci seront ceux que vous utilisez 99,9% du temps. Le paquet de développement sera typiquement une partie d'un installateur 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 installer.

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 à x86-64 (AMD64) mais la transition semble simple (un peu comme lors du passage de x86-16 à x86-32) avec quelques astuces supplémentaires telles que les registres supplémentaires r8 à r15 et que les registres principaux sont 64 bits de large. Je viens de courir à travers un environnement de développement pour XP / 64, Vista / 64 et 7/64 (fonctionne probablement pour le serveur OS:s aussi) et il est appelé Pelles C (pellesc.org). Il est écrit et maintenu par un Pelle Orinius en Suède et à partir des quelques heures que j'ai passé avec, je peux dire qu'il est destiné à devenir mon favori pour x86-64. J'ai essayé les paquets Visual Express (ils installent tellement de camelote - savez-vous combien de désinstallations vous devez faire par la suite? plus de 20) et a également essayé d'obtenir gcc d'un endroit pour travailler avec un IDE (eclipse ou quelque chose d'autre) d'un autre.

une fois que vous avez fait tout ce chemin et que vous rencontrez une nouvelle architecture, vous pourrez passer une heure ou deux à regarder la liste générée et après je sais à peu près à quelle autre architecture il ressemble. Si les constructions index et loop apparaissent é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 pris le coup, vous remarquerez qu'aux bureaux tout près, à la machine à café, dans les réunions, dans les forums et beaucoup d'autres endroits il y aura des individus qui vous attendront pour vous mépriser, se moquer de vous, jeter des citations incomplètes à vous et donner des conseils non informés/incompétents en raison de votre intérêt pour l'Assemblée. Pourquoi ils le font, je ne sais pas. Peut-être sont-ils eux-mêmes des programmeurs d'assemblage ratés, peut-être ne connaissent-ils que OO (C++, C# et Java) et n'ont-ils tout simplement aucune idée de ce qu'est un 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 quant à la raison pour laquelle l'assemblée est une perte de temps totale. Il y en a beaucoup ici à stackoverflow.

22
répondu Olof Forshell 2011-02-16 13:12:01

Get 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. Quand vous parlez de l'assemblée vous parler de jeux d'instructions. Peut-être sous-entendent-ils qu'un ensemble d'instructions de 32 bits est préférable d'apprendre de. Cependant, si c'est votre but, je suggère à Donald Knuths des livres sur les algorithmes -- ils enseignent les algorithmes en termes d'un ensemble d'instructions à 7 bits: d

pour les questions de portabilité, je suggère qu'au lieu de l'assemblage en ligne vous apprenez à utiliser les intrinsèques compilateurs -- ce sera la meilleure optimisation pour les optimisations Non-embarquées. : D

3
répondu Hassan Syed 2010-02-28 18:28:25

, 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, c'est-à-dire, 286/386 code mode réel. Par exemple, dans le code 16 bits, vous êtes forcé d'utiliser la segmentation de la mémoire qui est un concept important à comprendre. Aujourd'hui, les systèmes d'exploitation 32 et 64 bits sont encore démarré en mode réel, puis passer entre les modes.

mais si vous êtes intéressé par le développement d'applications/algorithmes, vous pourriez ne pas vouloir apprendre tous les trucs OS de bas niveau. Au lieu de cela, vous pouvez commencer tout de suite avec le 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.

0
répondu AndiDog 2010-02-28 18:26:18