J'ai commencé à écrire en assembleur en 1977 en prenant le chemin le plus long : d'abord apprendre les opérations de base (et, ou, xor, pas) et les mathématiques octales avant d'écrire des programmes pour le DEC PDP-8/E avec OS/8 et 8k de mémoire. C'était en 1977.
Depuis, j'ai découvert quelques astuces pour apprendre l'assemblage pour des architectures que je ne connais pas. Il y en a eu quelques-unes : 8080/8085/Z80, x86, 68000, VAX, 360, HC12, PowerPC et V850. J'écris rarement des programmes autonomes, ce sont généralement des fonctions qui sont liées au reste du système qui est généralement écrit en C.
Je dois donc tout d'abord être capable de m'interfacer avec le reste du logiciel, ce qui nécessite d'apprendre le passage des paramètres, la disposition de la pile, la création du cadre de la pile, la position des paramètres, la position des variables locales, la suppression du cadre de la pile, les valeurs renvoyées, le retour et le nettoyage de la pile. La meilleure façon de le faire est d'écrire une fonction qui appelle une autre fonction en C et d'examiner le listing de code généré par le compilateur.
Pour apprendre le langage d'assemblage lui-même, j'écris du code simple, en voyant ce que le compilateur génère et en le parcourant d'un seul pas dans un débogueur brut. J'ai les manuels d'instructions à portée de main pour pouvoir rechercher les instructions dont je ne suis pas sûr.
Une bonne chose à connaître (en plus de la manipulation de la pile mentionnée précédemment) est la façon dont le compilateur génère le code machine à partir d'une certaine construction du langage de haut niveau. Une telle séquence est la façon dont les tableaux/structures indexés sont traduits en pointeurs. Une autre séquence est la séquence de base du code machine pour les boucles.
Alors, qu'est-ce qu'un "débogueur brut" ? Pour moi, c'est un débogueur qui fait partie d'un paquet de développement simple et qui n'essaie pas de me protéger du matériel comme le(s) débogueur(s) visuel(s). Il me permet de passer facilement du débogage du code source au débogage de l'assemblage. Il démarre également rapidement à partir de l'IDE de développement. Il n'a pas trois mille fonctionnalités, plutôt trente, et ce sont celles que vous utiliserez 99,9 % du temps. Le paquet de développement fait généralement partie d'un programme d'installation dans lequel vous cliquez une fois sur l'approbation de la licence, une fois sur l'approbation de la configuration par défaut (n'aimez-vous pas que quelqu'un ait pensé à faire ce travail à votre place ?
J'ai un environnement de développement simple préféré pour x86-32 (IA-32) et c'est OpenWatcom. Vous pouvez le trouver à l'adresse openwatcom.org.
Je suis assez novice en matière de x86-64 (AMD64), mais la transition semble simple (un peu comme lorsqu'on passe de x86-16 à x86-32) avec quelques astuces supplémentaires comme les registres supplémentaires r8 à r15 et le fait que les registres principaux ont une largeur de 64 bits. Je suis récemment tombé sur un environnement de développement pour XP/64, Vista/64 et 7/64 (qui fonctionne probablement aussi pour les systèmes d'exploitation serveurs) et il s'appelle Pelles C (pellesc.org). Il est écrit et maintenu par un certain Pelle Orinius en Suède et d'après les quelques heures que j'ai passées avec, je peux dire qu'il est destiné à devenir mon préféré pour x86-64. J'ai essayé les paquets Visual Express (ils installent tellement de déchets - savez-vous combien de désinstallations vous devez faire ensuite ? plus de 20) et j'ai aussi essayé de faire fonctionner gcc d'un endroit avec un IDE (eclipse ou autre) d'un autre.
Une fois que vous êtes arrivé jusqu'ici et que vous rencontrez une nouvelle architecture, vous pourrez passer une heure ou deux à regarder le listing généré et après cela, vous saurez à peu près à quelle autre architecture elle ressemble. Si les constructions d'index et de boucles vous semblent étranges, vous pouvez examiner le code source qui les génère et peut-être aussi le niveau d'optimisation du compilateur.
Je pense que je dois vous avertir qu'une fois que vous aurez pris le coup de main, vous remarquerez qu'aux bureaux voisins, à la machine à café, dans les réunions, dans les forums et dans beaucoup d'autres endroits, il y aura des individus qui attendront pour vous mépriser, se moquer de vous, vous lancer des citations incomplètes et vous donner des conseils non informés/incompétents en raison de votre intérêt pour l'assemblée. Je ne sais pas pourquoi ils font cela. Peut-être sont-ils eux-mêmes des programmeurs assembleurs ratés, peut-être ne connaissent-ils que l'OO (C++, C# et Java) et n'ont-ils simplement aucune idée de ce qu'est l'assembleur. Peut-être que quelqu'un qu'ils "connaissent" (ou qu'un de leurs amis connaît) qui est "vraiment bon" peut avoir lu quelque chose dans un forum ou entendu quelque chose lors d'une conférence et peut donc délivrer une vérité absolue sur la raison pour laquelle l'assembleur est une perte de temps complète. Il y en a beaucoup ici sur stackoverflow.
1 votes
Envisagez de "programmer à partir de la base".
0 votes
Bonne chance, mec. L'écriture de montage est une vraie corvée. Je n'essaie pas de le décourager, mais c'est une sacrée entreprise.