La programmation en assembleur est particuli�rement p�nible si ce n'est pour certaines parties critiques des programmes.
Pour travail donn�, il faut l'outil appropri�; ne choisissez donc pas l'assembleur lorsqu'il ne correspond pas au probl�me � r�soudre: C, OCAML, perl, Scheme peuvent �tre un meilleur choix dans la plupart des cas.
Toutefois, il y a certains cas o� ces outils n'ont pas un contr�le suffisamment fin sur la machine, et o� l'assembleur est utile ou n�cessaire. Dans ces cas, vous appr�cierez un syst�me de programmation par macros, ou un syst�me de m�ta-programmation, qui permet aux motifs r�p�titifs d'�tre factoris�s chacun en une seule d�finition ind�finiment r�utilisable. Cela permet une programmation plus s�re, une propagation automatique des modifications desdits motifs, etc. Un assembleur de base souvent ne suffit pas, m�me pour n'�crire que de petites routines � lier � du code C.
Oui, je sais que cette partie peut manquer d'informations utiles � jour. Vous �tes libres de me faire part des d�couvertes que vous auriez d� faire � la dure...
GCC vous permet (et vous oblige) de sp�cifier les contraintes entre registres assembleurs et objets C, pour que le compilateur puisse interfacer le code assembleur avec le code produit par l'optimiseur. Le code assembleur en ligne est donc constitu� de motifs, et pas forc�ment de code exact.
Et puis, vous pouvez mettre du code assembleur dans des macro-d�finitions
de CPP ou des fonctions "en-ligne" (inline), de telle mani�re que tout le
monde puisse les utiliser comme n'importe quelle fonction ou macro C.
Les fonctions en ligne ressemblent �norm�ment aux macros mais sont parfois plus
propres � utiliser.
M�fiez-vous car dans tous ces cas, le code sera dupliqu�,
et donc seules les �tiquettes locales (comme 1:
)
devraient �tre d�finies dans ce code assembleur. Toutefois, une macro
devrait permettre de passer en param�tre le nom �ventuellement n�cessaire
d'une �tiquette d�finie non localement (ou sinon, utilisez des m�thodes
suppl�mentaires de m�ta-programmation).
Notez �galement que propager du code assembleur en-ligne r�pandra
les bogues potentiels qu'il contiendrait, aussi,
faites doublement attention � donner � GCC des contraintes correctes.
Enfin, le langage C lui-m�me peut �tre consid�r� comme �tant une bonne abstraction de la programmation assembleur, qui devrait vous �viter la plupart des difficult�s de la programmation assembleur.
M�fiez-vous des optimisations consistant � passer les arguments en utilisant les registres: cela interdit aux fonctions concern�es d'�tre appel�es par des routines exterieurs (en particulier celles �crites � la main en assembleur) d'une mani�re standard; l'attribut asmlinkage devrait emp�cher des routines donn�es d'�tre concern�es par de telles options d'optimisation. Voir les sources du noyau Linux pour avoir des exemples.
GAS a quelques menues fonctionnalit� pour les macro, d�taill�es dans la documentation TeXinfo. De plus
J'ai entendu dire que les versions r�centes en seront dot�es... voir les fichiers TeXinfo). De plus, tandis que GCC reconna�t les fichiers en .s comme de l'assembleur � envoyer dans GAS, il reconna�t aussi les fichiers en .S comme devant �tre filtrer � travers CPP avant d'�tre envoyer � GAS. Au risque de me r�p�ter, je vous convie � consulter les sources du noyau Linux.
Il ajoute toutes les fonctionnalit�s habituelles de macro � GAS. Voir sa documentation sous forme texinfo.
NASM poss�de aussi son syst�me de macros. Consultez sa documentation. Si vous avez quelqu'id�e lumineuse, contactez les auteurs, �tant donn� qu'ils sont en train de d�velopper NASM activement. Pendant ce m�me temps, lisez la partie sur les filtres externes un peu plus loin.
Il poss�de un syst�me simple de macros, mais je n'ai pas pu trouver de documentation. Cependant, les sources sont d'une approche particuli�rement ais�e, donc si vous �tes int�ress� pour en savoir plus, vous devriez pouvoir les comprendre sans probl�me. Si vous avez besoin d'un peu plus que des bases, vous devriez utiliser un filtre externe (voir un peu plus loin).
Quelque soit la gestion des macros de votre assembleur, ou quelque soit le langage que vous utilisez (m�me le C), si le langage n'est pas assez expressif pour vous, vous pouvez faire passer vos fichier � travers un filtre externe gr�ce � une r�gle comme suit dans votre Makefile:
%.s: %.S autres_d�pendances $(FILTER) $(FILTER_OPTIONS) < $<> $@
CPP n'est vraiment pas tr�s expressif, mais il suffit pour les choses faciles, et il est appel� d'une mani�re transparente par GCC.
Comme exemple de limitation, vous ne pouvez pas d�clarer d'objet de fa�on � ce qu'un destructeur soit automatiquement appel� � la fin du bloc ayant d�clar� l'objet. Vous n'avez pas de diversions ou de gestion de port�e des variables, etc.
CPP est livr� avec tout compilateur C. Si vous pouvez faire sans, n'allez pas chercher CPP (bien que je me demande comment vous pouvez faire).
M4 vous donne la pleine puissance du macro-traitement, avec un langage Turing-�quivalent, r�cursivit�, expressions r�guli�res, etc. Vous pouvez faire avec tout ce que cpp ne peut faire.
Voir macro4th/This4th que l'on trouve sur ftp://ftp.forth.org/pub/Forth/ dans Reviewed/ ANS/ (?), ou les sources de Tunes 0.0.0.25 comme exemple de programmation avanc�e en utilisant m4.
Toutefois, le syst�me de citation est tr�s p�nible � utiliser et vous oblige � utiliser un style de programmation par fonctions r�cursives avec passage explicite de continuation (CPS) pour toute programmation avanc�e (ce qui n'est pas sans rappeler � TeX -- au fait quelqu'un a-t-il d�j� essay� d'utiliser TeX comme macro-processeur pour autre chose que de la mise-en-page?). Toutefois, ce n'est pas pire que cpp qui ne permet ni citation ni r�cursivit�.
La bonne version de m4 � r�cup�rer est GNU m4 1.4 (ou ult�rieure si elle existe). C'est celle qui contient le plus de fonctionnalit� et le moins de bogues ou de limitations. m4 est con�u pour �tre intrins�quement lent pour toute utilisation sauf la plus simple; cela suffit sans aucun doute pour la plupart des programmes en assembleur (vous n'allez quand m�me pas �crire des millions de lignes en assembleur, si?).
Vous pouvez �crire votre propre programme d'expansion de macro avec les outils courants comme perl, awk, sed, etc. C'est assez rapide � faire et vous pouvez tout contr�ler. Mais bien toute puissance dans le macro-traitement doit se gagner � la dure.
Plut�t que d'utiliser un filtre externe qui effectue l'expansion des macros, une mani�re de r�aliser cela est d'�crire des programmes qui �crivent d'autres programmes, en partie ou en totalit�.
Par exemple, vous pourriez utiliser un programme g�n�rant du code source
Pensez-y!
Des compilateurs comme SML/NJ, Objective CAML, MIT-Scheme, etc, ont leur propre g�n�rateur de code assembleur, que vous pouvez ou non utiliser, si vous souhaitez g�n�rer du code semi-automatiquement depuis les langages correspondants.
Il s'agit projet utilisant le langage de programmation Icon pour b�tir une base de code de manipulation d'assembleur. Voir http://www.cs.virginia.edu/~nr/toolkit/
Le projet de syst�me d'exploitation OS d�veloppe son propre assembleur comme �tant une extension du langage Scheme. Il ne fonctionne pas encore totalement, de l'aide est bienvenue.
L'assembleur manipule des arbres de syntaxes symboliques, de telle mani�re qu'il puisse servir comme base d'un traducteur de syntaxe assembleur, un d�sassembleur, l'assembleur d'un compilateur, etc. Le fait qu'il utile un vrai langage de programmation puissant comme Scheme le rend imbatable pour le macro-traitement et pour la m�ta-programmation.
http://www.eleves.ens.fr:8080/home/rideau/Tunes/
Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 18:01:15