Est-il mériteraient d'apprendre le langage assembleur? [fermé]

vaut-il encore la peine d'apprendre ASM ?

j'en connais un peu, mais je ne l'ai pas vraiment utilisé ou appris correctement parce que tout ce que j'apprends à faire en assembleur je peux le faire en 1/10ème le temps avec un langage comme le C ou le c++. Alors, devrais-je vraiment apprendre et utiliser L'ASM? Est-ce que ça me fera du bien sur le plan professionnel? Il va augmenter ma débrouillardise? En bref, est-ce que ça ferait de moi un meilleur programmeur?

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

74
demandé sur nbro 2011-07-08 14:32:18

7 réponses

j'ai appris de Kip Irvine livre. Si vous ignorez les critiques (justes) de ses bibliothèques (non pertinentes), je peux le recommander comme une bonne introduction à la langue elle-même -- bien que pour le vraiment trucs intéressants, 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 tant qu'assembleur de recherche, vous en apprendrez plus sur le pipelinage cpu, la prédiction de branche, alignement du cache, SIMD, réorganisation des instructions, etc. La connaissance de ceux-ci vous aidera à écrire un meilleur code de haut niveau.

en outre, la sagesse traditionnelle est de ne pas essayer d'optimiser l'assemblage à la main la plupart du temps, mais laisser le compilateur s'en occuper. Quand vous voyez quelques exemples des choses tordues que les compilateurs produisent, vous comprendrez mieux pourquoi la sagesse conventionnelle tient.

Exemple: LFSRs courir vite avec le tourner-à-porter instruction, pour des cas spécifiques comme celui-ci, il est tout aussi facile d'écrire la version assembleur que de découvrir si oui ou non le compilateur est assez intelligent pour le comprendre. Parfois vous savez juste quelque chose que le compilateur ne sait pas.

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

certains simultanéité les questions ne deviennent apparentes que lorsque vous êtes conscient de ce qui se passe à chaque niveau de l'instruction.

il peut être utile parfois lors du débogage si vous n'avez pas le code source complet.

il y a la valeur curieuse. Comment les fonctions virtuelles sont-elles implémentées? Vous avez déjà essayé D'écrire des programmes DirectX ou COM dans assembleur? Comment les grandes structures sont-elles retournées, la fonction d'appel leur offre-t-elle un espace ou vice-versa?

puis il y a un montage spécial les langages pour le matériel graphique, bien que les langages de shader aient atteint un haut niveau il y a quelques années, tout ce qui vous permet de penser à un problème d'une manière différente est bon.

88
répondu spraff 2011-07-08 10:51:01

je trouve intéressant que tant de gens sautent pour dire que oui, vous avez besoin/devez apprendre l'Assemblée. Pour moi, la question est combien assemblée avez-vous besoin de savoir? Je ne pense pas que vous devez connaître assembly comme un langage de programmation, c'est-à-dire Je ne crois 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 signifie réellement (ce qui pourrait exiger plus de connaissance de l'architecture que le assembleur) est suffisant.

je ne peut écrire de l'assemblée (c'est à dire écrire non trivial morceau de code dans l'assemblée), mais je peux le lire et qui, ensemble, avec la connaissance réelle de l'architecture matérielle, et les conventions d'appel qui sont utilisés suffit d'analyser les performances, et d'identifier ce morceau de code C++ a été la source de cette assemblée.

39
répondu David Rodríguez - dribeas 2017-07-24 05:35:33

Oui, la principale raison d'apprendre l'assemblée pour le C et le C++ est-il aide à comprendre ce qu'il se passe sous le capot de code C et C++. Ce n'est pas que vous écrirez du code dans assembly, mais vous pourrez regarder le démontage du code pour évaluer son efficacité et vous comprendrez comment différentes fonctionnalités C et c++ fonctionnent beaucoup mieux.

21
répondu sharptooth 2017-05-23 11:54:56

il est intéressant d'apprendre beaucoup de langues différentes, à partir de nombreux paradigmes différents. Apprendre Java, C++, C#, et Python ne compte pas, car ce sont tous des instances du même paradigme.

comme l'assemblée est à la racine (bien, près de la racine) de toutes les langues, je dis qu'il vaut la peine d'apprendre l'Assemblée.

encore une fois, il est intéressant d'apprendre un langage de programmation fonctionnel, programmation logique, langage de script, mathématiques langues. Tu n'as pas beaucoup de temps, donc tu dois choisir.

15
répondu David Hammen 2017-08-03 17:31:18

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

4
répondu ain 2017-08-03 17:31:50

avez-vous des utiliser dans ce que vous comptez faire? cela va-t-il vous aider d'une manière ou d'une autre dans ce que vous faites ou prévoyez de faire actuellement? ce sont les deux questions à vous poser, la réponse est la réponse à votre question.

dans un sens plus général, oui, je dirais à mon avis qu'il vaut la peine d'apprendre asm (quelque chose comme x86 ou arm), la mesure dans laquelle il vous sert dépend de ce que vous programmez et comment votre débogage il.

2
répondu Necrolis 2011-07-08 10:37:33

dépend du niveau de programmation que vous souhaitez atteindre. Si vous avez besoin de travailler avec des débogueurs alors oui. Si vous avez besoin de savoir comment fonctionnent les compilateurs, alors oui. N'importe quel assembleur/débogueur est dépendant du CPU, donc il y a beaucoup de travail, il suffit de vérifier la taille et l'âge de la famille x86.

2
répondu GJ. 2011-07-08 10:59:09