Compilateur asm, comment ça fonctionne ?

Compilateur asm, comment ça fonctionne ? - ASM - Programmation

Marsh Posté le 30-06-2005 à 14:31:08    

Bonjour, je sais en gros comment fonctionne les compilateurs, on fait une analyste syntaxique, grammaticale, etc pour transformer cela en assembleur, puis en code objet, puis en executable. En bref ce n'est que de la conversion de format de fichier en y ajoutant le nécessaire avec l'éditeur de liens.  
 
La ou je me pose des questions c'est pour les compilateurs assembleur, si je voudrais en écrire un, quelle est le format du code objet, est-ce qu'il y a un standard précis à respecter ? Ensuite comment savoir en quoi traduire les instructions asm en son équivalent binaire ?? Est-ce qu'il y a une liste quelque part ?  
 
Suite à cela, après avoir analysé le code source, transformé cela en une suite binaire, comment savoir quelle instruction doit aller ou dans le fichier objet ? (à moins qu'il y ait un format précis) Est-ce qu'on enregistre la conversion de façon séquentielle pour faire un gros fichier .o qui contient l'équivalent binaire du code source dans le même ordre que ça à été écrit ? Parce que ça revient au même, à moins bien sûr que par exemple l'instruction MOV sont équivalent binaire ne soit pas (4D4F56) soit 10011010100111101010110 mais autre chose. Dans mon exemple MOV == à '10011010100111101010110' selon le code ascii, est-ce que le cpu respecte la norme ascii ?  
 
merci de m'éclaire sur ces points  :hello:

Reply

Marsh Posté le 30-06-2005 à 14:31:08   

Reply

Marsh Posté le 30-06-2005 à 14:53:02    

recherche sur opcode, formats de fichiers PE ou ELF, ce sera un bon début

Reply

Marsh Posté le 30-06-2005 à 15:04:58    

Ok merci :)

Reply

Marsh Posté le 30-06-2005 à 15:30:32    

J'ai cherché sur Google, mais je n'ai rien trouvé de précis  :(  
 
Tout ce que je trouves sur Google c'est des sites qui parlent des instructions: MOV, DIV, etc. mais sans parler de leur équivalent binaire ni de la façon de les écrire dans le fichier objet.

Reply

Marsh Posté le 30-06-2005 à 15:37:08    

Citation :

comment savoir en quoi traduire les instructions asm en son équivalent binaire ??


 
y'a un format la aussi, tu penses (et non le cpu lit pas de l'ascii [:zaib3k]
 
globalement, et pour simplifier, ca a la tronche :
 
[opcode d'instruction] [MODRM] [SIB] [DEPLACEMENT] [CONSTANTE]
 
le premier opcode indique l'instruction qu'on veut utiliser
l'octet modrm explicite les operandes. De mémoire, il est composé en 3 parties
 11 222 333  
 
la partie 1 indique la taille des operandes (8,16,32 bits)
la partie 2 indique l'operande de destination OU est parfois un modifieur de l'instruction (oué c'est le bordel)
la partie 3 indique la source
 
SIB : Scale Increment byte pour coder des trucs genre mov [eax + ebx * 4 +127]
 
DEPLACEMENT : le +127 de mon exemple d'au dessus
CONSTANT : bin une constante, genre dans mov [eax+2],5986
 
bref y'a pas de solution, faut se palucher l'encodage a la main a partir de la doc intel...
 
 
 
 
 
 
 
 
 
 
 

Reply

Marsh Posté le 30-06-2005 à 15:46:24    

Ok :) Mais si je comprends bien, cette traduction du code on la place séquentiellement dans un fichier objet, enfin un fichier .o, un fichier txt ou peu importe et c'est la qu'intervient l'éditeur de liens ? Pour convertir ce fichier objet en un format d'un OS, PE, ELF, etc ?
 
Le fichier objet a un format précis ou si on écrit toute la traduction du code de façon séquentielle ? :)

Reply

Marsh Posté le 30-06-2005 à 15:48:58    

bin ensuite au niveau des format d'executable, j'en ai aucune idée. Moi j'avais fait un truc a moi parce que je le pouvais, je suis pas allé plus loin. Je peux t'aider sur l'encodage d'opcode mais ca sera tout :d

Reply

Marsh Posté le 30-06-2005 à 15:53:14    

Ok :)
 
À part la doc de intel qui est volumineuse, je voudrais pas me perdre dans ces documents :D Est-ce qu'il y a un simple fichier txt quelque part sur le net qui a une liste des opcodes avec leur équivalent binaire incluant SIB DEPLACEMENT, etc ? :D
 
J'aimerais faire un compilateur asm, je crois que c'est une bonne base à avoir, ça aide à comprendre bien des choses je crois :) Et j'aimerais bien faire ce compilateur en asm :D
 

Reply

Marsh Posté le 30-06-2005 à 15:59:00    

le fichier objet a un format précis (notamment, tu as la définition des symboles dans l'objet avec une information pour savoir s'ils sont dans l'objet ou externes afin que l'éditeur de lien puisse s'y retrouver)
 
Et oui, c'est l'éditeur de lien qui sort le fichier au format PE (pour windows) ou ELF (pour linux, BSD ou autre)
 
Edit : je ne suis pas trop sur de moi dans ce domaine, donc je laisse d'autres personnes me corriger si je me trompe ... :jap: En tout cas, il me semble bien que le format des objets dépend du compilateur, même si tu peux faire des suppositions sur ce que tu devras trouver dedans


Message édité par theshockwave le 30-06-2005 à 16:00:10
Reply

Marsh Posté le 30-06-2005 à 16:01:17    

NullDragon a écrit :

Ok :)
 
À part la doc de intel qui est volumineuse, je voudrais pas me perdre dans ces documents :D Est-ce qu'il y a un simple fichier txt quelque part sur le net qui a une liste des opcodes avec leur équivalent binaire incluant SIB DEPLACEMENT, etc ? :D
 
J'aimerais faire un compilateur asm, je crois que c'est une bonne base à avoir, ça aide à comprendre bien des choses je crois :) Et j'aimerais bien faire ce compilateur en asm :D


 
ouais, j'en avais de la bonne, mais C'etait sur un site nommé "webster"
 
ah bin j'avais fait un topic ici meme, fait une recherche sur mon pseudo en auteur (avec juste "titre de message" de choisi) et regarde dans les vieux topics (genre 2-3ans)

Reply

Marsh Posté le 30-06-2005 à 16:01:17   

Reply

Marsh Posté le 30-06-2005 à 16:10:41    

Hmm, je n'ai rien trouvé  :pt1cable:  
 
Il est écrit webster dans le titre du sujet ? Tu l'avais posté dans la section programmation ASM ? :)

Reply

Marsh Posté le 30-06-2005 à 16:15:31    

Reply

Marsh Posté le 30-06-2005 à 16:21:54    

Merci  :jap:

Reply

Marsh Posté le 30-06-2005 à 16:32:05    

Autre petite question :D
 
Je vais tenter de créer un petit OS, j'aime la programmation système et bas niveau et si je comprends bien c'est le créateur du OS qui décide de son format d'exécutable, pour Windows c'est PE par exemple. Mais le loader fonctionne comment lui exactement ? Car c'est le loader qui prend les instruction dans l'exe et place cela en mémoire puis envoie un Jmp au cpu pour qu'il exécute les instructions du exe n'est-ce pas ? :D
 
Comme le cpu ne comprend que ses instructions, il faut que le loader décortique l'exe et c'est aussi lui qui load par exemple une dll et la décortique à son tour, etc. ? :D

Reply

Marsh Posté le 30-06-2005 à 16:34:24    

jcrois tu vas trop vite en besogne. Au besoin, fait toi deja ton format d'execute et ensuite code (en C ou autre) le loader qui chargera et executera le code. T'aurais le temps pour penser au reste plus tard)

Reply

Marsh Posté le 30-06-2005 à 16:46:34    

Ok :) Mais c'est justement ce que je me demande, comment fonctionne un loader et un format d'exe, est-ce qu'un format d'exe doit contenir des trucs de base qui sont commun à tout les exe ? Mis à part de contenir les instructions :D Ensuite je supposes que le loader doit aller cibler le point d'entrée de l'exe, d'ou la nécessité des main() et winmain() dans les programmes :D Mais est-ce que le passage de la main au cpu se fait uniquement par un Jump ou si c'est plus complexe que ça ?
 
Je me suis toujours demandé pourquoi Microsoft avait décidé de changer le nom main() pour Winmain() à part l'esthétique.  [:chacal_one333]

Reply

Marsh Posté le 30-06-2005 à 16:50:48    

le prototype de winmain est different de main

Reply

Marsh Posté le 30-06-2005 à 16:52:28    

Ah ? Différent en quoi ? il me semble qu'un point d'entrée c'est un point d'entrée :D

Reply

Marsh Posté le 30-06-2005 à 17:00:34    

l'exe peut contenir pas mal de choses, des indications sur l'adresse à laquelle sera chargée le programme (pour le PE, et évidemment, l'adresse est exprimée dans l'espace d'adressage du processus qui sera créé) et des adresses pour les symboles à des fins de debug, par exemple. J'ai encore un souvenir assez amer des stabs du format ELF que j'ai pu découvrir il y a quelques mois ... heureusement que j'ai pas trop eu à bosser là-dessus ...
 
Normalement, tu dois pouvoir trouver une description de ces formats assez facilement sur google

Reply

Marsh Posté le 30-06-2005 à 17:01:37    

NullDragon a écrit :

Ah ? Différent en quoi ? il me semble qu'un point d'entrée c'est un point d'entrée :D


 
 
le point d'entrée dans ton programme est rarement main ou même winmain.
 
Le vrai point d'entrée se chargera de faire des opérations préalables (notamment le préchargement de certaines DLL) avant de lancer ton main ou ton winmain, selon les cas

Reply

Marsh Posté le 30-06-2005 à 17:02:05    

NullDragon a écrit :

Ah ? Différent en quoi ? il me semble qu'un point d'entrée c'est un point d'entrée :D


 
ouais, sauf que ton point d'entrée il accepte peut etre des parametres [:el g]

Reply

Marsh Posté le 30-06-2005 à 17:14:56    

Ah oui :)
 
Mais un main() aussi accepte des paramètres non ? :D
 
Je suis en train de lire le format PE, c'est très intéressant, ça dit entre autre que le fichier est complètement loadé en mémoire, mais que les sections ne sont pas nécessairement alignées les unes après les autres.
 
Je sens que je vais m'amuser :D
 
Mais dans l'en-tête il y a des signatures pour identifier par exemple sur quelle machine et OS le exe doit tourner. Ces différentes signatures, est-ce qu'il y en a une liste complète quelque part ? Est-ce qu'il y a une norme ISO derière ça ou si c'est Microsoft qui à décidé que ce serait ça ? :D

Reply

Marsh Posté le 30-06-2005 à 17:25:32    

je sais que dans l'ELF, on peut savoir si l'exécutable est prévu pour tourner sur un hôte big endian ou little endian, donc j'imagine qu'on doit aussi pouvoir savoir si on doit s'attendre à un proc 64 bits ou non ou ce genre de subtilité ... Cependant, ce n'est pas limitatif à _1_ os ... on peut faire tourner des programmes linux sous BSD, par exemple (si, en activant l'émulation linux dans le kernel [:petrus75] {edit : sous NetBSD, en tout cas :o} )
 
Edit : un acronyme te servira aussi peut-être bientôt : ABI


Message édité par theshockwave le 30-06-2005 à 17:29:57
Reply

Marsh Posté le 30-06-2005 à 17:39:31    

ABI ? :)
 
Qu'est-ce que c'est ?  [:chacal_one333]

Reply

Marsh Posté le 30-06-2005 à 17:43:20    

Helene et les garcons, le miel et les abeilles, tout ca

Reply

Marsh Posté le 30-06-2005 à 19:31:41    

NullDragon a écrit :

ABI ? :)
 
Qu'est-ce que c'est ?  [:chacal_one333]


Application Binary Interface
ce sont les conventions d'appel de fonction

Reply

Marsh Posté le 30-06-2005 à 19:46:44    

Ok :) Mais concrètement c'est quoi une "convention" d'appel ?  :whistle:

Reply

Marsh Posté le 30-06-2005 à 19:49:00    

jcrois tu veux griller les etapes la, c'est la base d'un appel de fonction ca

Reply

Marsh Posté le 30-06-2005 à 19:53:51    

Non c'est juste que j'aime bien regarder un peu de tout en général, ça m'aide à faire les liens entre tout les éléments :) La base d'un appel de fonction ?
 
Des fonctions qu'on créé soi-même ou existance, sous C par exemple ??
 
Il y a une façon de les appeler ? je croyais qu'il suffisant de donner l'adresse de la fonction, prendre les paramètre dans la pile, exécuter les instructions, mettre le retour dans la pile, jump sur la fonction de retour, prendre la valeur dans la pile s'il y a lieu, etc. :D

Reply

Marsh Posté le 30-06-2005 à 19:55:15    

NullDragon a écrit :

Non c'est juste que j'aime bien regarder un peu de tout en général, ça m'aide à faire les liens entre tout les éléments :) La base d'un appel de fonction ?
 
Des fonctions qu'on créé soi-même ou existance, sous C par exemple ??
 
Il y a une façon de les appeler ? je croyais qu'il suffisant de donner l'adresse de la fonction, prendre les paramètre dans la pile, exécuter les instructions, mettre le retour dans la pile, jump sur la fonction de retour, prendre la valeur dans la pile s'il y a lieu, etc. :D


 
oué, en gros, enfin, faut savori que IP est pushé sur lors d'un call et le pop+jmp est fait par ret
 
la question c'est  
1/ ou tu passes les parametres d'une fonction
2/ dans quel ordre
3/ que fais tu des registres ALU et de la pile FPU
 
 

Reply

Marsh Posté le 30-06-2005 à 19:55:43    

en C++ tu peux modifier la convention d'appel. Genre sous VS t'as les mots clés
 
__cdecl, __stdcall __fastcall


Message édité par chrisbk le 30-06-2005 à 19:56:02
Reply

Marsh Posté le 30-06-2005 à 20:00:00    

Ah oui j'avais vu cela en C++ j'y ait lu quelques textes sur ça, si j'ai bien compris c'est la façon dont on passe les paramètres dans quel ordre et comment se traite le retour.
 
Ou on les passes, tu veux dire ou mettre les valeurs des variables ? Sur la pile j'imagine :D
 
Qu'est-ce les registres ALU et la pile FPU ? C'est une pile prédifini par le cpu ??
 
Mais tout cela est d'ordre d'un OS ou si c'est "général" dans le sens ou ça dépend du Loader ?

Reply

Marsh Posté le 02-07-2005 à 14:28:43    

pour les conventions d'appels ( et le reste de l'assembleur )
http://www.mentaloverflow.de/robsi [...] ok-pdf.zip
pour le décodage d'opcode
http://pr0g.free.fr/fichiers/opcodedecodingp1.txt
la dedans aussi il doit y avoir des trucs
http://www.intel.com/design/pentiu [...] ex_new.htm
 
bon courage  :hello:

Reply

Marsh Posté le 02-07-2005 à 17:02:42    

Merci  :jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed