8
votes

Comment puis-je devenir bon à l'assemblée?

La réponse à cette question est, bien sûr, "écrit du code de montage!"

Mais je peux faire cela: je connais la syntaxe de base x86, les types de registres et comment les utiliser, les sous-programmes, etc.

Lorsque j'ai pris une classe d'assemblage, chaque affectation avait un nombre maximal d'instructions que nous avons autorisées à utiliser. Si nous sommes passés, alors nous perdrions des points - cela nous a donc appris à faire les choses efficacement . Vous savez, efficacement dans la manière dont vous avez vu un programme C faisant de telles choses, vous pourriez harceler sur cette personne pour créer du code difficile à suivre.

pour C, on peut suggérer "écrire un programme multi-threadé" ou "écrire un serveur de socket / client". Pour PHP, des suggestions pourraient être "Écrire un logiciel de blog personnel". Pour apprendre la syntaxe d'une langue, le "projet Euler" est souvent suggéré.

Donc, mes questions sont les suivantes:

  1. Quels types de choses puis-je écrire en montage qui me permettra de manipuler mes compétences de montage et d'efficacité? Par exemple, je pourrais faire un problème d'Euler de projet en X86, mais cela ne m'aidait pas aux compétences spécifiques à l'assemblage. Quelles sont les idées de projet que je pourrais faire cela ne peut vraiment être codé que dans l'assembleur?

  2. Comment irai-je au profilage, que j'écris ou non "bon" code? Par exemple, avec C et Sockets, il y a un milliard de tutoriels sur le Web et il y a un milliard de personnes sur ma liste d'amis qui peuvent regarder mon code et il y a un milliard de questions à leur sujet: il est donc plus facile de mesurer ses progrès.

  3. Y a-t-il des projets lourds d'assemblage existants que je peux regarder pour apprendre? Ou même des parties de programmes où ils se brisent en montage pour [tâche spécifique] pour des raisons d'efficacité?

  4. Quels types de livres devrais-je lire? Les blogs de personnes qui regardent systématiquement des choses de bas niveau?

    (de préférence des choses que je pouvais faire sur x86 sur Linux. Je pense que les concepts porteront sur d'autres architectures.)


6 commentaires

Juste curieux - une fois que vous avez "bon" à l'assemblée, que comptez-vous faire avec cela? Ces compilateurs écrivent une meilleure assemblée que vous ne pouvez, dans presque chaque cas (à l'exception des caractéristiques du processeur qui ne sont pas pris en charge en C, comme la lecture de bits de débordement ou autre).


RHAT a dit: Étudiez les textes fatmap.txt et fatmap2.txt. Vous les trouverez via Google. Ils ont été écrits au 90e et sont toujours les non-plus-ultra en matière de rasâtre logicielle. Il y a eu des améliorations au cours de la dernière décennie, mais ils se concentrent principalement sur des implémentations matérielles.


@Seth: Si on est vraiment "bon" à l'assemblage d'écriture, les compilateurs actuels font certainement pas rédiger une meilleure assemblée que vous.


@Stephen Eh bien, bien sûr. Si vous êtes "bon", vous pouvez battre le compilateur. Mais, je peux déjà avoir vraiment près de la vitesse de la première classe et fabriquée à la main avec -o4 et une boucle C bien écrite. Il n'y a tout simplement pas de nombreux cas (emplois) où vous devez réellement faire ce type d'optimisation assez souvent pour garder vos compétences nettes (aucune que je suis au courant).


@Seth Eh bien, je n'ai pas une bonne réponse à cela. Je suppose que quelqu'un doit être capable d'écrire un compilateur? Et j'aimerais pouvoir évaluer les optimisations du compilateur et le code de montage généré et dire "Oh, le compilateur a fait cette pour ce code". Je suis assez compétent que je me sente un peu comme un programmeur Java - je suis habitué à ce que celles-ci fournit, mais j'aimerais comprendre ce qui se passe un peu mieux et être en mesure d'évaluer de manière empiriquement quand utiliser l'assemblage par rapport à la non-question. De plus, je suis curieux des types de problèmes que je ne peut pas résoudre maintenant parce que je ne connais pas l'ASM. Beaucoup de raisons!


@rascher bien, si c'était moi, j'écrirais un rendu 3D. Les résultats sont bien refroidissants et il y a beaucoup d'endroits pour creuser et optimiser. Je ne sais pas s'il utilisait ASM ou non, mais ce gars ( Skytopie. com / projet / fractal / mandelbulb.html # fond ) a dû écrire un rendu 3D et les résultats sont spectaculaires!


6 Réponses :


2
votes

Que écrire:

Écrivez un rendu mappé de texture 3D simple. C'est un projet décent parce que ce n'est pas super complexe mais pas super trivial. Et le fait que vous puissiez voir les résultats que le fonctionnement est toujours agréable.


1 commentaires

+1 - Les graphiques sont toujours agréables pour les yeux et toujours une niche où vous pouvez faire une différence notable avec assembleur. Obtenir la cartographie de la texture n'est pas également trivial. Faisable bien sûr, mais toujours une tâche.



3
votes

Une approche peut être de choisir des fonctions à partir de la bibliothèque Standard C (E.G. Fonctions de chaîne, MEM * ()) à appliquer à partir de zéro en montage. Construisez un harnais d'analyse comparative pour mesurer les performances de votre code, voir si vous pouvez égaler ou mieux les performances des bibliothèques fournies sur votre système. Je ne considérerais pas qu'il ne triche pas pour démonter le code de la bibliothèque système (après avoir pris une balayage), des techniques souvent utiles peuvent être trouvées en inspectant le code désassemblé. La lecture d'autres amis est fortement recommandée (peut-être en commençant par les bits d'assemblage Codde trouvés dans les sources de noyau Linux.)


0 commentaires

6
votes

bonnes réponses. Je suggère également d'écrire un petit compilateur et de l'avoir écrit la langue de montage pour vous. De cette façon, vous devez penser à différentes façons de faire des choses dans l'assembleur, comme des arguments de passage, de créer des cadres de pile, de composer des expressions d'adresses, d'indexation de la matrice, de la gestion de la mémoire, des conditionnels, des boucles, des captures d'essai, etc., etc.


5 commentaires

Cela semble être la meilleure réponse à moi. Voyons en face: Il n'y a que 3 raisons de programmer en montage ces jours-ci. 1) Vous ne pouvez pas obtenir un compilateur pour votre plate-forme. 2) Vous devez écrire un compilateur. 3) Vous devez optimiser le code qu'un compilateur ne reçoit pas. C'est la seule suggestion qui peut aider avec 2 et 3, et il n'ya vraiment rien qui puisse aider avec 1, et c'est assez rare.


D'accord, pensez simplement que peut-être que 1 est plus commun que je ne l'ai donné de crédit pour ... mais l'objectif n'est généralement pas de laisser un tel matériel spécialisé sans outils appropriés. Habituellement, n'utilisez pas un compilateur ici signifie que l'on est inventé au fur et à mesure que nous parlons.


@San: thx. J'avais l'habitude de faire beaucoup d'assembleur pour diverses plateformes, mais le seul compilateur autour était Fortran. En outre, lorsqu'il est arrivé à faire des graphiques, surtout sur un 8088, vous devez vous procurer de manière vraiment bonne pour compter les cycles.


@San: 4) Vous avez besoin d'accès aux instructions qui n'exposent pas de langue de niveau élevé ou moyen. Par exemple, des récupérations de mémoire avec un accès MMU simulé, un accès aux drapeaux arithmétiques, l'accès aux drapeaux FIQ / IRQ, l'accès à l'interface co-processeur, l'interface de cache, etc., etc., etc. La plupart d'entre eux sont nécessaires lors de la rédaction de pilotes de microprogrammes ou de périphériques.


@Mads Point pris. J'avais grigna des situations comme celle-là sous 1 pour aucune raison.



1
votes

Si vous sautez avec les deux pieds vous convient, envisagez d'améliorer les boucles internes d'un calcul de masse distribuée Projet de BOINC -Sike Seti @ Home . ( Autres projets ici .)

sur mes ordinateurs, chaque unité de travail SETI @ home a besoin d'heures à crunch et est presque parfaitement liée à la CPU. En règle générale, les compilateurs C / C ++ ne sont pas excellents pour organiser des opérations de point flottant et d'entière parallèles, notamment pour chaque type de CPU. Il serait particulièrement utile d'optimiser, disons les instructions X86 pour optimiser les capacités particulières de la CPU qu'elle s'exécute réellement sur: SSE SSE2, 80586, 80686, Athlon, etc. Ceux qui fonctionnent toujours dans un quincaillerie de dix ans de dix ans apprécieraient de telles L'optimisation et le matériel moderne bénéficieront sans doute d'un grand diplôme.


0 commentaires

1
votes

Premier, comment définir un "bon code de montage"? Le code le plus rapide, le code conformé au plus abi, ou le code qui est le plus facile à lire? Je pense que "bien" dépend de l'objectif général, et vous ne nous avez pas vraiment dit ce que vous voulez utiliser l'assemblage pour.

Autres recommandés à écrire un logiciel Rasterizer. Je pouvais verrouiller cela, mais depuis que vous connaissez déjà le X86 Mnemonics, vous n'avez pas vraiment besoin d'écrire plus de code de montage. Ce dont vous avez besoin, c'est plus d'informations sur la manière dont les machines fonctionnent sous la hotte.

Ma suggestion est d'écrire un émulateur de système ou d'espace utilisateur. J'ai écrit un émulateur système pour ARM920 et j'ai appris une tonne, sans écrire un seul assemblage mnémonique! D'accord, ça s'est fini sur des morts lents, mais je l'ai écrit comme un interprète de Pure C. Je connais maintenant la plupart des secrets sombres de l'architecture des bras et cela m'a donné une nouvelle perspective sur la marche des ordinateurs intégrés.

N'oubliez pas que les périphériques peuvent être complexes à imiter. Il n'y a rien de mal à imiter la CPU, mais ajout de Psuedo-périphériques simplifiés. Si vous êtes bon, vous pouvez même créer un système de plug & de jeu pour eux.

Vous voudrez peut-être consulter le QEMU et Dosbox Sources pour obtenir de bonnes idées, bien qu'ils utilisent un système JIT. Mon interprète est trouvé ici GP2XEMU . C'était une tentative d'émulateur pour le GP2X, mais je suis resté coincé à cause de la documentation Sucky.


0 commentaires

3
votes

Assembly peut faire de nombreuses choses que c ne peut pas, et l'optimiseur n'est pas magique. Cela dit, la plupart des choses utiles qui ne nécessitent pas que vous soyez une demi-divinité d'assemblage tomber dans le compilateur, les bibliothèques standard et les catégories d'exécution d'interpréter.

Les trampolines, par exemple sont ou peuvent être utiles dans les trois, et vous ne pouvez tout simplement pas utiliser C pour composer une pile d'appel arbitraire.

Pour écrire un meilleur assemblage, lisez les manuels ici:

http://www.agner.org/optimize/

Voir les programmes écrits exclusivement à l'assemblage et une communauté obsédée par l'optimisation de votre référence:

http://flatassembler.net/


0 commentaires