Comment son passé les paramètres et les arguments ? - ASM - Programmation
Marsh Posté le 07-04-2004 à 23:46:13
Ok, je vais essayer de pas faire trop d'erreurs, je vais repondre vite fait de memoire
Alors premier point, un exe != dll
On peut dire vite fait qu'un exe c le code des fonctions + les donnees statiques + des points d'entrees (ajoutes par le compilo) + un header pour l'OS.
Une DLL c grosso-modo le code des fonctions + les donnees statiques + un point d'entree mais totalement different (pas executable justement).
Bon, la facon dont est charge un programme depends de l'os, mais grosso modo ca donne ca:
- decodage de l'entete de l'exe.
- chargement de l'image du code en memoire.
- chargement des data statiques en memoire.
- chargement des symbols externe (relocation).
- debut d'execution du code.
Bon, c'est pas forcement l'ordre et c super simplifie, mais c l'idee!
La partie interressante c'est justement le chargement des symbols externes (fonctions ou donnees). Ca veut dire que dans le code de l'exe on a une liste de fonctions qui ne sont pas presentes dans le binaire et qu'il faut aller chercher ailleur. C'est justement dans les dll qu'on vas trouver ces fonctions. Pour s'y retrouver dans les fonctions, ca depends de comment ca a ete compile, mais grosso modo les fonctions exportes par les dll sont repertories par le systeme.
Donc quand le systeme trouve une fonction a importer dans un exe, il vas fouiller les dll pour la charger en memoire (dans une zone differente du process du prog).
Bon, c peut etre pas super clair, mais je pourrais preciser plus si tu veux (ou quelqu'un d'autre pourra me corriger
Enfin, apres au niveau des fonctions pour les parametres et tout ca en asssembleur, c la jungle! ca depends vachement de l'archi en fait!
Mais grosso-modo sur x86, dans ton code (asm donc) une frame est creer pour executer la fonction (on fait un decallage dans le code pour pointer sur le code de la fonction je crois). Ensuite, les arguments de la fonction sont empiles au debut de la frame (en fin sur d'autres archis); l'ordre des arguments et leur nombre depends des compilos/archis/os. Lorsque dans ton code tu fait reference a un parametre, il vas le chercher la ou il l'a empile. Ensuite le retour de la fonction est stocke dans un registre qui sera reccupere dans la fonction appelante (depends aussi de pleins de trucs).
Bref, c pas clair et c'est normal c super different selon les archis!
Pour plus de precisions, faudrait se concentrer sur une plateforme en particulier.
Bon, j'espere ne pas avoir trop embrouille les choses!
a+
Marsh Posté le 07-04-2004 à 23:54:31
juste une correction : le retour de la fonction n'est pas stocké dans un registre, mais est empilé sur la pile, avec les paramètres de la fonction. le registre ESP est le pointeur de la pile, et il pointe sur le dernier élément empilé, qui est très souvent l'adresse de retour de la fonction (à manier avec précaution)
Marsh Posté le 08-04-2004 à 07:41:21
Super je comprends mieux maintenant
Mais la je me questionne sur le fonctionnement de la mémoire, car en mode protégé c'est bien différent, quelqu'un peut-il m'expliquer clairement le fonctionnement de la GDT, LDT, etc ? et ce fonctionnement est identique sous n'importe quel OS ? mais sûrement différent du processeur en dehors de la norme x86 comme par exemple un Sparc ? et si je comprends bien c'est par exemple Windows(le kernel) qui gère les exécution des programmes ? exe, dll, etc ? donc si je boot avec une diskette, il n'y a donc pas possibilité d'exécuter un programme qui à besoin d'une dll ?
Marsh Posté le 20-04-2004 à 22:03:28
Pour la GDT et la LDT, il n'y a pas assez de place ici pour te répondre. Je te conseille les pdf de intel sur le 386 et 486...
Le fonctionnement est généralement indentique d'un OS à l'autre pour les processeurs intel.
Cela n'empèche pas un autre processeur d'exécuter du code intel il faut juste un interpréteur (comme FX!32).
Windows ne fait pas que gérer les DLL, EXE... Il a un rôle bien plus important : Le time-slicing ! Ou comment faire croire à un utilisateur que plusieurs programmes fonctionnent en même temps...
Il fait aussi d'autres tâches propres à un OS... Gestion de la mémoire, des exceptions, des erreurs, des I/O...
Tu peux tout à fait exécuter une DLL à partir d'une disquette de boot ! Il te faut juste faire un travail énorme : écrire un noyau, les librairies nécessaires à la DLL, les APIs...
Marsh Posté le 07-04-2004 à 06:19:27
Comment est-ce que ça fonctionne au niveau de la mémoire lorsqu'un exe est chargé en mémoire et que une des fonctions de la dll est utilisé ? car une dll c'est un exe, exact ? alors le cpu exécute seulement la fonction x ou si il cherche dans tout le exe la fonction x ? et puis ou sont stocké temporairement les arguments passé à la fonction puis renvoyé et comme l'autre exe sait ou est stocké la valeur renvoyé ?