C'est la solution la plus pratique.
Consultez la documentation de gcc
et prenez exemple sur les sources du noyau Linux
(fichiers .S
qui sont utilis�s avec gas, non pas as86).
Les arguments 32 bits sont empil�s dans la pile vers le bas dans
l'ordre inverse de l'ordre syntaxique
(c'est-�-dire qu'on acc�de aux arguments ou les d�pile
dans l'ordre syntaxique), au-dessus de l'adresse de retour 32 bits.
%ebp
, %esi
, %edi
,
%ebx
doivent �tre conserv�s par l'appel�,
les autres registres peuvent �tre d�truits;
%eax
doit contenir le r�sultat,
ou %edx:%eax
pour des r�sultats sur 64 bits.
Pile virgule flottante: je ne suis pas s�r,
mais je pense que le r�sultat se trouve dans st(0)
,
la pile �tant � la discr�tion de l'appel�.
Notez que GCC poss�de certaines options pour modifier les conventions d'appel en r�servant certains registres, en mettant les arguments dans des registres, en supposant que l'on ne poss�de pas de FPU, etc. Consultez les pages .info concernant le i386.
Il faut prendre garde � d�clarer l'attribut cdecl
pour une
fonction qui suit la convention standard GCC (je ne sais pas exactement
ce que cela produit avec des conventions modifi�es). Consultez la
documentation GCC dans la section: C Extensions::Extended Asm::
Certains compilateurs C ajoutent un underscore avant tout symbole, alors que d'autres ne le font pas.
En particulier, la version GCC a.out effectue ce genre d'ajouts, alors que la version ELF ne le fait pas.
Si vous �tes confront� � ce probl�me, regardez comment des paquetages existants traitent le probl�mes. Par exemple, r�cup�rer une ancienne arborescence des sources de Linux, Elk, les qthreads ou OCAML...
Vous pouvez �galement red�finir le renommage implicite de C en assembleur en ajoutant les instructions suivantes:
void truc asm("machin") (void);
Remarquez que l'outil objcopy
, du paquetage binutils
,
devrait vous permettre de transformer vos fichiers objets a.out
en objets ELF et peut-�tre inversement dans certains cas.
D'une mani�re plus g�n�rale, il vous permet d'effectuer
de nombreuses conversions de formats de fichiers.
Il n'est absolument pas recommand� d'effectuer de tels appels
par ce que leurs conventions peuvent changer de temps en temps,
ou d'un type de noyau � un autre (cf L4Linux),
de plus, ce n'est pas portable, difficile � �crire,
redondant avec l'effort entrepris par libc,
et enfin, cela emp�che les corrections et les extensions effectu�es
� travers la libc, comme par exemple avec le programme zlibc
qui r�alise une d�compression � la vol�e de fichiers compress�s avec gzip.
La mani�re standard et recommend�e d'effectuer des appels syst�mes
est et restera de passer par la libc.
Les objets partag�s devraient r�duire l'occupation m�moire des programmes,
et si vous souhaitez absolument avoir de petits ex�cutables, utilisez
#!
avec un interpr�teur qui contiendra tout ce que
vous ne voulez pas mettre dans vos binaires.
Maintenant, si pour certaines raisons, vous ne souhaitez pas effectuer une �dition des liens avec la libc, r�cup�rez-la et essayez de comprendre comment elle fonctionne! Apr�s tout, vous pr�tendez bien la remplacer non?
Vous pouvez aussi regarder comment eforth 1.0c le fait.
Les sources de Linux sont fort utiles, en particulier le fichier d'en-t�te asm/unistd.h qui d�crit comment sont effectu�s les appels syst�me...
Le principe g�n�ral est d'utiliser l'instruction
int $0x80
avec le num�ro de l'appel syst�me
__NR_
machin (regarder dans asm/unistd.h
)
dans %eax
,
et les param�tres (jusqu'� cinq) dans
%ebx
, %ecx
, %edx
,
%esi
, %edi
. Le r�sultat est renvoy� dans
%eax
avec un r�sultat n�gatif �tant l'erreur
dont l'oppos� est tranf�r� par la libc dans errno. La pile utilisateur
n'est pas modific�e donc n'avez pas besoin d'en avoir une correcte
lors de l'appel.
Si vous souhaitez effectuer des entr�es/sorties directement sous Linux,
soit il s'agit de quelque chose de tr�s simple qui n'a pas besoin
de sp�cificit�s du syst�me et dans ce cas l�, consultez le mini-HOWTO
IO-Port-Programming
, ou alors vous devez cr�er un nouveau gestionnaire
de p�riph�rique et vous devriez alors lire quelques documents
sur les m�andres du noyau, le d�veloppement de gestionnaires de
p�riph�riques, les modules du noyau, etc. Vous trouverez d'excellents
HOWTO ou autres documents du projet LDP.
Plus particuli�rement, si vous souhaitez r�aliser des programmes graphiques, rejoignez le projet GGI: http://synergy.caltech.edu/~ggi/http://sunserver1.rz.uni-duesseldorf.de/~becka/doc/scrdrv.html
Dans tous les cas, vous devriez plut�t utiliser l'assembleur en ligne de GCC avec les macros provenant des fichiers linux/asm/*.h que d'�crire des sources en assembleur pur.
De telles choses sont th�oriquement possibles (preuve: voir comment DOSEMU permet � des programmes d'acc�der au port s�rie), et j'ai entendu des rumeurs que certaines personnes le font (avec le gestionnaire PCI? Acc�s aux cartes VESA? PnP ISA? Je ne sais pas). Si vous avez de plus amples pr�cisions � ce sujet, soyez les bienvenus. Le bon endroit � regarder est les sources du noyau, les sources de DOSEMU (et des autres programmes se trouvant dans le r�pertoire DOSEMU), ainsi que les sources d'autres programmes bas niveaux (peut-�tre GGI s'il g�re les cartes VESA).
En fait, vous devez utiliser soit le mode prot�g� 16 bits, soit le mode vm86.
Le premier est plus simple � configurer mais il ne fonctionne qu'avec du code ayant un comportement propre qui n'effectue pas d'arithm�tique de segments ou d'adressage absolu de segment (en particulier pour l'adressage du segment 0), � moins que par chance tous les segments utilis�s peuvent �tre configur� � l'avance dans le LDT.
La seconde possiblit� permet d'�tre plus "compatibles" avec les environnements 16 bits mais il n�cessite une gestion bien plus compliqu�e.
Dans les deux cas, avant de sauter sur le code 16 bits, vous devez:
Encore une fois, lisez attentivement les codes sources situ�s dans le r�pertoire de DOSEMU et consorts, en particulier ces mini-�mulateurs permettant de faire tourner des programmes ELKS et/ou des .COM assez simples sous Linux/i386.
La plupart des �mulateurs DOS sont livr�s avec certaines interfaces
d'acc�s aux services DOS. Lisez leur documentation � ce sujet, mais bien
souvent, ils ne font que simuler int $0x21
et
ainsi de suite, donc c'est comme si vous �tiez en mode r�el
(je doute qu'ils aient de possibilit�s de fonctionner avec des
op�randes 32 bits: ils ne font que r�fl�chir l'interruption dans
le mode r�el ou dans le gestionnaire vm86).
Certaines documentations concernant DPMI (ou ses variantes peuvent) �tre trouv�es sur ftp://x2ftp.oulu.fi/pub/msdos/programming/
DJGPP est livr� avec son propre sous-ensemble, d�riv�, ou remplacement (limit�) de la glibc.
Il est possible d'effectuer une compilation crois�e de Linux vers DOS. Consultez le r�pertoire devel/msdos/ de votre miroir FTP de sunsite.unc.edu. Voir �galement le dos-extender MOSS du projet Flux d'utah.
D'autres documentations et FAQ sont plus consacr�s � DOS. Nous d�conseillons le d�veloppement sous DOS.
Heu, ce document ne traite que de libre logiciel. T�l�phonez-moi lorsque Windaube le deviendra ou du moins ses outils de d�veloppement!
En fait, apr�s tout, cela existe: Cygnus Solutions a d�velopp� la biblioth�que cygwin32.dll pour que les programmes GNU puissent fonctionner sur les machines MicroMerdiques. Donc, vous pouvez utiliser GCC, GAS et tous les outils GNU ainsi que bon nombre d'applications Unix. Consultez leur site Web. Je (Far�) ne souhaite pas m'�tendre sur la programmation sous Windaube, mais je suis s�r que vous trouverez tout un tas d'informations partout...
Le contr�le sur le syst�me �tant ce qui attire de nombreux programmeurs vers l'assembleur, une pr�misse ou un corollaire naturel de son utilisation est la volont� de d�velopper son propre syst�me d'exploitation. Remarquons tout d'abord que tout syst�me permettant son auto-d�veloppement pourrait �tre qualifi� de syst�me d'exploitation, combien m�me tournerait-il au-dessus d'un autre syst�me sur lequel il se d�chargerait de la gestion du multit�che (Linux sur Mach) ou des entr�es/sorties (OpenGenera sur Digital Unix), etc. Donc, pour simplifier le d�bogage, vous pouvez souhaiter d�velopper votre syst�me d'exploitation comme �tant un processus fonctionnant sous Linux (au prix d'un certain ralentissement), puis, utiliser le Flux OS kit (qui permet l'utilisation des drivers Linux et BSD dans votre propre syst�me d'exploitation) pour le rendre ind�pendant. Lorsque votre syst�me est stable, il est toujours temps d'�crire vos propres gestionnaires de mat�riels si c'est vraiment votre passion.
Ce HowTo ne couvrira pas des sujets comme le code de chargement du syst�me, le passage en mode 32 bits, la gestion des interruptions, les bases concernant les horreurs des processeurs Intel (mode prot�g�, V86/R86), la d�finition de votre format d'objets ou de vos conventions d'appel. L'endroit o� vous pourrez trouver le plus d'informations concernant tous ces sujets est le code source de syst�me d�j� existants.
Un grand nombre de pointeurs se trouvent dans la page: http://www.eleves.ens.fr:8080/home/rideau/Tunes/Review/OSes.html
Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:15