Envoyé par
AND66
Mais pour en revenir à la question de départ, je veux savoir comment on passe de ça :
Tu brûles les étapes et comme tu as une idée en tête, ça t'empêche d'explorer les autres possibilités.
On ne passe pas directement de .text movb $0x02, %al à ELF\00\00\00\00\00\ [
] 00\00X\90\00\00\00\00\00\00\00_start\00__bss_start\00_edata\00_end\00
… mais de ceci
MOV AL,02h ; Syntaxe Intel
… à ceci
C'est l'unique code produit par l'assembleur pour la ligne source donnée. Ça te permet notamment de constater que c'est extrêmement concis (et heureusement, sinon les ordinateurs ne se seraient jamais développés ces quarante dernières années).
Ce n'est qu'ensuite que ce code va être encapsulé en tant que ressource dans un format plus ou moins versatile qui permettra de le manipuler et éventuellement de l'associer à d'autres codes compilés. Normalement, c'est le travail de l'éditeur de liens de faire tout cela. Le linker LD de GNU dispose d'une suite de descripteurs de formats binaires appelés BFD qui permettent de faire cela de manière unifiée (et évolutive). L'ennui, c'est que pour manipuler le code, assembleurs, compilateurs et éditeurs de liens ont besoin de méta-informations le concernant et à cause de cela, les assembleurs sont donc obligés de produire leurs fichiers de sortie directement dans le format final. La plupart d'entre eux prennent donc en charge un nombre minimum de formats.
Pour le parsing en particulier, bien que la syntaxe de l'assembleur soit très rudimentaire, il est toujours utile de connaître un minimum de langage formel car la génération du code machine associé est toujours beaucoup plus contextuelle qu'on ne le croit. En outre, il te faudra tenir compte de toutes les directives d'assemblages et être capable de résoudre des expressions arithmétiques complexes, qui sont parfaitement admissibles au sein d'un source en assembleur tant que le résultat est compatible avec le format de l'opérande que l'on cherche à renseigner.
Partager