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).
programming-languages
assembly
nasm
ApprentiHacker
la source
la source
Réponses:
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.
la source
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.
la source
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.
la source
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.
la source
Connaître ASM est également utile lors du débogage, car parfois tout ce que vous avez est un "vidage ASM de l'erreur".
la source
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.
la source
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.
la source