web-dev-qa-db-fra.com

Est-il utile d'apprendre le langage d'assemblage?

Est-il toujours utile d'apprendre ASM ?

J'en connais un peu, mais je ne l'ai pas vraiment utilisé ou appris correctement, car tout ce que j'apprends à assembler est réalisable en un dixième de fois avec un langage comme le C ou le C++. Alors, devrais-je vraiment apprendre et utiliser ASM? Est-ce que cela me fera du bien professionnellement? Cela augmentera-t-il ma débrouillardise? En bref, cela ferait-il de moi un meilleur programmeur?

Remarque: je parle d'assemblage de bas niveau comme FASM ou NASM et non quelque chose comme HLA (assembleur de haut niveau).

83
ApprenticeHacker

J'ai appris de Kip Irvine's livre. Si vous ignorez les critiques (justes) de ses bibliothèques (non pertinentes), je peux le recommander comme une bonne introduction au langage lui-même - bien que pour le vraiment des choses intéressantes, vous devez traquer les obsédés sur le net.

Je pense qu'il est utile de comprendre ce qui se passe aux niveaux inférieurs. En recherchant un assembleur, vous en apprendrez plus sur le traitement en pipeline des processeurs, la prédiction de branche, l'alignement de cache, le SIMD, la réorganisation d'instructions, etc. La connaissance de ceux-ci vous aidera à rédiger un meilleur code de haut niveau.

De plus, il est généralement convenu de ne pas essayer d'optimiser manuellement Assembly la plupart du temps, mais de laisser le compilateur s'en préoccuper. Lorsque vous verrez des exemples de choses tordues générées par les compilateurs, vous comprendrez mieux pourquoi la sagesse conventionnelle tient.

Exemple: les instructions LFSR fonctionnent rapidement avec l'instruction Rotation-avec-Report. Pour des cas spécifiques comme celui-ci, il est aussi facile d'écrire la version de l'assembleur que de découvrir si le compilateur est suffisamment intelligent pour le comprendre. Parfois vous savez juste quelque chose que le compilateur ne sait pas.

Cela vous permet également de mieux comprendre les problèmes de sécurité - écriture ou exécution, dépassements de pile, etc.

Certains problèmes simultanéité ne deviennent apparents que lorsque vous êtes conscient de ce qui se passe au niveau de chaque instruction.

Cela peut être utile parfois lors du débogage si vous ne possédez pas le code source complet.

Il y a la valeur de curiosité. Comment les fonctions virtuelles sont-elles implémentées de toute façon? Avez-vous déjà essayé d’écrire des programmes DirectX ou COM en assembleur? Comment les grandes structures sont-elles renvoyées, la fonction appelante leur offre-t-elle un espace ou inversement?

Ensuite, il existe des langages d'assemblage spéciaux pour le matériel graphique, bien que les langages de shader soient de haut niveau il y a quelques années, tout ce qui vous permet de réfléchir à un problème de manière différente est bon.

96
spraff

Je trouve intéressant que tant de gens s'empressent de dire que oui, vous devez/devriez apprendre l'Assemblée. Pour moi, la question est combien d’Assemblées avez-vous besoin de savoir? Je ne pense pas que vous ayez à connaître l’Assemblée comme un langage de programmation, c’est que je ne pense pas que tout le monde devrait pouvoir écrire un programme en Assembly, mais d'un autre côté, être capable de le lire et de comprendre ce que cela signifie réellement (ce qui peut nécessiter plus de connaissances de l'architecture que l'assembleur) est suffisant.

Je ne peux évidemment pas écrire Assembly (c'est-à-dire écrire un morceau de code non trivial dans Assembly), mais je peux le lire et le faire en même temps que la connaissance de l'architecture matérielle réelle et des conventions d'appel utilisées est suffisant pour analyser les performances et identifier quel morceau de code C++ était la source de cet assembly.

Oui, la principale raison d'apprendre Assembly pour les développeurs C et C++ est que cela aide à comprendre ce qui se passe sous le capot du code C et C++. Ce n'est pas que vous allez réellement écrire du code dans Assembly, mais vous serez en mesure d'examiner le désassemblage du code pour évaluer son efficacité et vous comprendrez comment différentes fonctionnalités C et C++ fonctionnent beaucoup mieux.

25
sharptooth

Cela vaut la peine d'apprendre beaucoup de langues différentes, à partir de nombreux paradigmes différents. L'apprentissage de Java, C++, C # et Python ne compte pas, car ce sont toutes des instances du même paradigme.

Comme l’Assemblée est à la base de toutes les langues, c’est pour ma part qu’il vaut la peine de l’apprendre.

Là encore, il vaut la peine d'apprendre un langage de programmation fonctionnel, la programmation logique, les langages de script, les langages basés sur les mathématiques. Vous avez seulement beaucoup de temps, vous devez donc choisir.

22
David Hammen

Connaître ASM est également utile lors du débogage, car parfois tout ce que vous avez est "ASM dump of error".

4
ain

dépend du niveau de programmation que vous souhaitez atteindre. Si vous devez travailler avec des débogueurs, cliquez sur OUI. Si vous avez besoin de savoir comment fonctionnent les compilateurs, alors OUI. Tout assembleur/débogueur dépend du processeur, il y a donc beaucoup de travail. Il suffit de vérifier la famille x86 pour déterminer son poids et son âge.

2
GJ.

Avez-vous des tiliser dans ce que vous envisagez de faire? Est-ce que cela va vous aider de quelque manière que ce soit dans ce que vous faites ou avez l'intention de faire? Ce sont les deux questions que vous devriez vous poser, la réponse à celles-ci est la réponse à votre question.

De manière plus générale, oui, je dirais qu'à mon avis, cela vaut la peine d'apprendre asm (quelque chose comme x86 ou arm), à quel point cela vous sert dépend de ce que vous programmez et de la façon dont vous le corrigez.

2
Necrolis