Je regardais le problème 48 du projet Euler :
La série, 1 1 + 2 2 + 3 3 + ... + 10 10 = 10405071317.
Trouvez les dix derniers chiffres de la série, 1 1 + 2 2 + 3 3 + ... + 1000 1000 .
En Python, je peux le faire avec une seule ligne:
sum((x**x for x in xrange(1,1001))
Mais l'équivalent en assemblage serait de 100 lignes et un véritable défi.
Dois-je faire certaines de ces énigmes en assembleur pour avoir un aperçu de la programmation de bas niveau et comprendre comment l'ordinateur fonctionne réellement?
self-improvement
assembly
Nishant
la source
la source
*
en Python?Réponses:
Au-delà de l'apprentissage de l'assemblage, je crois qu'apprendre comment un langage de bas niveau comme C est compilé est très précieux. Donc ma réponse est oui, mais là encore, je suis probablement biaisé parce que j'aime la programmation de bas niveau.
Par exemple, comprendre comment les instructions simples sont compilées. La fonction suivante,
... devient (le bit intéressant au moins):
Ce code prend l'argument de la pile (val, le paramètre à func), le décale de 2 places à gauche (multipliez par 2 ^ 2 ou 4) puis ajoute la valeur d'origine au résultat. Le résultat final est une multiplication par 5. Un exemple comme celui-ci illustre un certain nombre de choses à prendre en compte, telles que les optimisations du compilateur. Au lieu d'appeler une instruction à multiplier directement par 5, elle décale de deux endroits pour se multiplier par 4, puis ajoute la valeur d'origine. J'ai trouvé des exemples comme celui-ci pour améliorer considérablement ma compréhension des choses à un niveau inférieur.
Générez la sortie de l'assembleur à partir de gcc avec l'
-S
option. Cependant, sachez que les résultats varient selon le compilateur et le niveau d'optimisation.Quoi qu'il en soit, je ne pense pas qu'être programmeur en langage assembleur équivaut à comprendre l'assemblage . Encore une fois, je pense que la programmation dans un langage comme C et savoir comment il est mis dans le code machine est une pratique précieuse.
la source
Probablement pas nécessaire pour pouvoir réellement écrire l'assembleur (dont la plupart sont des détails sur la convention d'initialisation et d'appel pour votre système).
Cela vaut la peine de comprendre certains, au cas où vous essayez de déboguer quelque chose sans source.
MAIS cela vaut vraiment la peine de comprendre la machine au moins au niveau du 'C' et des pointeurs (essentiellement un assembleur de haut niveau) afin que vous sachiez pourquoi concaténer une chaîne un million de fois dans une boucle est mauvais.
la source
for i in range(1000000): s = s + '.'
pas être pire que les versions "optimisées" que je réutilises
. De même, plusieurs autres développements invalident ce qui est une hypothèse raisonnable avec la connaissance C et supposant une implémentation naïve. Mais en général, c'est plus utile que nuisible. N'oubliez pas que les implémentations de langage sont parfois plus intelligentes que vous;)Bonne question. L'apprentissage de l'Assemblée est certainement bon et vaut l'effort.
la source
Oui et non.
S'il est vrai que cela vous permettra de mieux comprendre ce que fait votre code et pourquoi certaines choses ne sont qu'une mauvaise idée, vous devez penser à l'effort.
Apprendre à assembler n'est pas un projet de fin de semaine, cela vous prendra beaucoup de temps et vous devez vous demander si ce temps pourrait être mieux utilisé.
Si vous n'êtes pas dans le code optimisé, vous ne verrez probablement jamais d'avantages égaux à l'effort que vous y consacrez.
la source
J'ai fait beaucoup d'assembleur quand j'étais plus jeune et je ne pense pas que cela ait aidé à comprendre quoi que ce soit en dehors de l'assembleur. Si vous jetez un œil à l'assembleur moderne, tout est de toute façon en langage macro. Je déteste habituellement les analogies, mais voici quand même: savoir comment fonctionne le moteur d'une voiture fait-il de vous un meilleur conducteur?
la source
La façon dont j'ai travaillé sur la compréhension de l'assembleur consiste à écrire des programmes dans des langages de niveau supérieur, puis à remplacer des pièces par (au moins, espérons-le) des parties de code assemblé fonctionnellement équivalentes. Cela signifie que je peux utiliser les HLL pour ce qu'ils sont bons pour organiser et résoudre des problèmes de haut niveau et j'utilise asm pour frapper le métal.
(Quand je parle du programme hôte écrit dans un HLL, je veux dire C ou ObjC lorsque j'essaie d'apprendre asm x86_64, et BASIC lorsque je travaille sur Z80, 6502 et 6809 asm).
la source