Dois-je essayer de faire des problèmes d'entraînement en assemblage? [fermé]

9

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?

Nishant
la source
2
Si vous ne savez pas comment fonctionne la mémoire, comment peut-on s'attendre à traiter des sujets tels que les pointeurs? Si vous ne comprenez pas comment fonctionne un ordinateur et un système d'exploitation, comment pouvez-vous programmer une application?
Ramhound
Je peux faire beaucoup d'abstractions Ramhound, c'est pourquoi je vous ai posé cette question. Je pourrais ne pas avoir la maîtrise complète des pointeurs encore capables de faire quelque chose dans les pointeurs comme l'échange, ce qui est logique une fois que vous supposez que les pointeurs stockent l'emplacement de la mémoire d'un autre type de données. Encore une fois Ramhound puisque vous avez suggéré que je devrais comprendre ces choses, les sujets que je devrais lire? Un langage d'assemblage et un peu de COA serait bien?
Nishant
Si vous ne maîtrisez pas complètement les pointeurs, vous constaterez que cela constitue un grave inconvénient à certains endroits.
David Thornley
3
Soit votre ligne Python calcule x ^ 2 pour x en 1..1000 (au lieu de x ^ x pour x en 1..1000), soit python est encore plus magique que je ne le pensais. :)
Ingo
La fonction "augmenter la puissance de" est-elle *en Python?

Réponses:

1

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,

int func(int val)
{
  int num = val * 5;
  return num;
}

... devient (le bit intéressant au moins):

movl    %edi, -20(%rbp)
movl    -20(%rbp), %edx
movl    %edx, %eax
sall    $2, %eax
addl    %edx, %eax

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' -Soption. 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.

M. Shickadance
la source
11

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.

Martin Beckett
la source
En fait, certaines implémentations relativement intelligentes ne peuvent for i in range(1000000): s = s + '.'pas être pire que les versions "optimisées" que je réutilise s. 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;)
2
@delnan -J'ai juste besoin d'un petit exemple de cas où quelque chose qui semble anodin en Java / C # pourrait être très cher sur silicium. J'ai notamment rencontré beaucoup de gens qui pensent qu'une grande allocation de mémoire et une copie sont instantanées.
Martin Beckett
Je déteste croire que delnan :-)
Nishant
5

Bonne question. L'apprentissage de l'Assemblée est certainement bon et vaut l'effort.

  1. Une telle compréhension de bas niveau sera utile pour le développement de logiciels embarqués
  2. Refactoring à bas niveau
  3. Il vous aidera à utiliser efficacement le débogueur
  4. Vous donner une compréhension du code désassemblé pour vous aider dans des choses comme les grottes de code
Aditya P
la source
2
J'ai dû rechercher des codecaves. Je les utilise beaucoup, mais nous les appelons maintenant "Détours". research.microsoft.com/en-us/projects/detours
ProdigySim
1

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.

Skeith
la source
1

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?

Ian
la source
Connaître le fonctionnement d'un moteur automobile fait-il de vous un meilleur conducteur? Non, mais cela fait de vous un meilleur propriétaire de voiture, car si le moteur tombe en panne, vous pouvez le réparer.
Cameron Martin
D'accord, mais cela ne fait pas de vous un meilleur pilote, ce qui est l'analogie que j'utilisais. En réparant le moteur vous-même, vous ne soutenez pas l'économie au sens large en employant la mécanique, ... Les analogies ont des limites. En général, je ne découragerais jamais quelqu'un de chercher à apprendre quelque chose s'il est intéressé, mais je pense que vous devez aller assez loin dans le terrier du lapin pour pouvoir l'appliquer utilement à des langues de niveau supérieur. Pour commencer, vous devez comprendre les optimisations de compilation utilisées par le langage spécifique s'il est compilé, ou l'interpréteur, ou la gigue. C'est un immense domaine.
Ian
1

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