Vaut-il la peine d'apprendre le langage d'assemblage? [fermé]

92

Vaut-il toujours la peine d'apprendre l' ASM ?

J'en connais un peu, mais je ne l'ai pas vraiment utilisé ou appris correctement car tout ce que j'apprends à faire en assembleur je peux le faire en 1 / 10ème du temps avec un langage comme C ou C ++. Alors, dois-je vraiment apprendre et utiliser ASM? Cela me fera-t-il du bien professionnellement? Cela augmentera-t-il ma débrouillardise? Bref, cela ferait-il de moi un meilleur programmeur?

Remarque: je parle d'assemblage de bas niveau comme FASM ou NASM et non de quelque chose comme HLA (High-Level Assembler).

ApprentiHacker
la source
2
Notez que le langage d'assemblage est lié à un processeur / contrôleur.
rmflow
7
Vous voulez dire que ce n'est pas multiplateforme? !!
ApprenticeHacker
Non. Par exemple: worldofspectrum.org/Z80instructions.html
rmflow
2
Ok, donc il y a un langage d'assemblage différent pour chaque processeur ??? !!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker
3
Un langage d'assemblage différent pour chaque famille de processeurs. Le code 386 fonctionne sur n'importe quel processeur x86 ultérieur, y compris les offres Intel et AMD - mais certains ensembles de fonctionnalités sont des extensions de propriété. Le langage est le même pour ces instructions supplémentaires mais le binaire résultant ne sera pas portable.
spraff du

Réponses:

107

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

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

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

Exemple: les LFSR s'exécutent rapidement avec l'instruction rotate-with-carry, pour des cas spécifiques comme celui-ci, il est tout 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 simplement 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 de concurrence ne deviennent apparents que lorsque vous êtes conscient de ce qui se passe au niveau par instruction.

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

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

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

spraff
la source
7
Réponse bien écrite +1. Apprendre et utiliser sont deux choses différentes, apprendre c'est une bonne idée, quand / si l'utiliser vient avec l'expérience.
old_timer
Pour donner un exemple, Linus Torvalds utilise un désassembleur pour déboguer son code donc je pense qu'il a une bonne connaissance de l'assemblage x86.
Ivanzinho
52

Je trouve intéressant que tant de gens sautent pour dire que oui, vous devez / devez apprendre l'assemblage. Pour moi, la question est de savoir combien d'assemblage avez-vous besoin de savoir? Je ne pense pas que vous deviez connaître l'assembly comme un langage de programmation, c'est-à-dire que je ne pense pas que tout le monde devrait être capable d'écrire un programme en assembly, mais d'un autre côté, être capable de le lire et de comprendre ce qu'il en fait signifie (qui peut exiger plus de connaissances de l'architecture que l'assembleur) est suffisant.

Je ne peux certainement pas écrire l' assembly (c'est-à-dire écrire un morceau de code non trivial dans l'assembly), mais je peux le lire et cela, avec la connaissance de l'architecture matérielle réelle, et les conventions d'appel utilisées sont suffisantes pour analyser les performances, et identifier quel morceau de code C ++ était la source de cet assembly.

David Rodríguez - Dribeas
la source
4
Vous voulez dire que je devrais simplement apprendre les commandes de base push, pop, mov et invoke ?
ApprenticeHacker
10
Je suis d'accord, la nécessité de connaître l'assemblage dépend beaucoup de la branche de programmation avec laquelle vous travaillez. Web / bureau / base de données? Oubliez l'assembleur. Jeux informatiques et graphiques? Cela pourrait être quelque peu pratique. Développement d'OS ou systèmes embarqués en temps réel? C'est un must. Etc.
Lundin
1
Vous déformez les autres réponses - personne ne dit que vous avez besoin / devriez apprendre l'assemblage; juste qu'il est utile ou utile, selon la question. Votre réponse est cependant toujours d'actualité.
Luc Danton
1
@burningprodigy: Je pense que vous devriez avoir des connaissances de base sur la façon dont les instructions sont dans l'assembleur que vous utilisez (c'est-à-dire quel est l'ordre des arguments et autres), et une compréhension très basique de quelques commandes, quelle charge ou un magasin est. Ensuite, si vous avez besoin de regarder un assemblage, vous pouvez utiliser une référence pour comprendre chacune des instructions, et ce faisant, vous commencerez à apprendre les bases dont vous avez besoin.
David Rodríguez - dribeas
1
Je suis d'accord. Surtout, seul le fait de savoir que l'assemblage vous permettra au mieux d'évaluer l'efficacité des processeurs modernes. Si tel est le but, une petite connaissance de base de l'assemblage avec une bonne part des bases des architectures informatiques est bien plus utile. La plupart du temps, j'ai besoin d'assembler pour regarder à travers des décharges de programmes optimisés, ou pour le plaisir (par exemple, des trucs de sécurité, l'écriture d'un mini noyau, ..). Mais je ne me souviens pas de la dernière fois que j'ai changé une décision de conception en raison de mes connaissances en assemblage.
Voo le
27

Oui - la principale raison d'apprendre l'assemblage 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 l'assembly, mais vous pourrez regarder le désassemblage du code pour évaluer son efficacité et vous comprendrez comment les différentes fonctionnalités C et C ++ fonctionnent beaucoup mieux.

dents acérées
la source
23

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'assembly est à la racine (enfin, proche de la racine) de tous les langages, je dis pour ma part qu'il vaut la peine d'apprendre l'assemblage.

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

David Hammen
la source
Et puis, quand vous les avez appris enfin tous et pensez que vous avez un aperçu de ce qui se passe, vous découvrez J .
Micha Wiedenmann
4

Connaître ASM est également utile lors du débogage, car parfois tout ce que vous avez est un "vidage ASM de l'erreur".

ain
la source
2

En avez-vous l' utilité dans ce que vous envisagez de faire? va-t-il vous aider de quelque manière que ce soit dans ce que vous faites ou prévoyez de faire actuellement? ce sont les deux questions que vous devriez vous poser, la réponse à celles-ci est la réponse à votre question.

Dans un sens plus général, oui, je dirais qu'à mon avis, il vaut la peine d'apprendre asm (quelque chose comme x86 ou arm), à quel point il vous sert dépend de ce que vous programmez et de la façon dont vous le déboguez.

Nécrolis
la source
2

Dépend du niveau de programmation que vous souhaitez atteindre. Si vous avez besoin de travailler avec des débogueurs, 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 taille et l'âge de la famille x86.

GJ.
la source
Peut-être voulez-vous dire dépendant de la famille CPU?
Romeno