Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Utilisation d'Amiga.lib (exemple dans des programmes assembleur)
(Article écrit par Denis Jarril et extrait d'Amiga News Tech - mai 1991)
|
|
Après avoir vu à quoi servait la fameuse amiga.lib,
si chère à tous les programmeurs en C, nous allons aujourd'hui nous intéresser à la manière de l'utiliser
dans des programmes en assembleur.
Il est donc maintenant question d'utiliser amiga.lib pour une série de tâches dont il serait bien
inutile de réécrire soi-même le code, des bonnes âmes charitables s'en étant déjà chargé pour nous.
Comme disait mon grand-père : "y'en a qui aiment le boulot, autant le leur laisser".
Pour illustrer la manière dont il faut s'y prendre, je vous ai concocté un petit programme de
démonstration. Il contient des appels à diverses fonctions d'amiga.lib, aussi bien du module
"exec_support" que du module "clib" (reportez-vous à l'article du mois dernier pour plus de détails).
Paramètres
C'est maintenant bien connu, le langage C passe les paramètres des fonctions qu'il appelle par
l'intermédiaire de la pile, en sens inverse de leur énumération. Par exemple, la ligne :
buffer = AllocMem(10000, MEMF_CHIP|MEMF_CLEAR);
|
...est compilée en :
MOVE.L #$10002,-(A7) ; MEMF_CHIP|MEMF_CLEAR
MOVE.L #$2710,-(A7) ; 10000
JSR _AllocMam(PC) ; Saut à AllocMem
ADDQ.L #8,A7 ; Correction de la pile
|
Il faudra en tenir compte plus tard, toutes les fonctions d'amiga.lib ayant été écrites en C.
Au passage et pendant que j'y pense, l'instruction PEA du 68000 est très pratique pour celui
qui manipule souvent la pile : elle à le même effet (et la même syntaxe) qu'un LEA suivi
d'un empilement dû registre, mais évite, justement, l'utilisation d'un registre.
CLIB
La partie baptisée "clib" d'amiga.lib contient quelques fonctions directement empruntées à
la bibliothèque standard du C, stdio, à savoir :
- printf : effectue une sortie formatée sur stdout.
- puts : affiche une chaîne + CR sur stdout.
- putchar : affiche un caractère sur stdout.
- getchar : lit un caractère depuis stdin.
- fprintf : effectue une sortie formatée dans un fichier.
- fputs : envoie une chaîne + CR dans un fichier.
- fputc : envoie un caractère dans un fichier.
- fgetc : lit un caractère depuis un fichier.
- sprintf : effectue une sortie formatée dans un tampon mémoire.
Toutes ces fonctions s'utilisent quasiment de la même manière que leurs homonymes de
la bibliothèque C standard. Quelques petites différences subsistent toutefois :
- Elles utilisent RawDoFmt() d'exec.library (spécifique Amiga).
- Les nombres réels ne sont pas gérés (la honte sur moi).
Au fait, vous avez remarqué que certaines font appel à stdin ou à stdout ?
Ce sont, en C, les canaux standard d'entrées-sorties, avec stderr (utilisé pour les messages
d'erreur). Ces pointeurs doivent être valides lors de l'appel aux fonctions, d'où l'ouverture
de la dos.library en début de programme, et l'appel aux fonctions Input() pour stdin et
Output() pour stdout. Quant à stderr, il est initialisé avec Open("*"), ce qui l'empêche
d'être redirigé avec les caractères ">" et "<" du CLI...
Assemblage
Le programme Clib.s (original, non ?) doit évidemment être assemblé en code reliable,
sensible à la casse, avec ou sans symboles, ce n'est pas grave. Les possesseurs de Devpac
2 sauront comment faire, et les possesseurs de K-Seka peuvent toujours changer d'assembleur.
L'édition de liens est obtenue (ave BLink du SAS C) par la ligne de commande :
BLink FROM Clib.o TO Clib LIBRARY LIB.amiga.lib [NODEBUG]
|
Nous verrons le mois prochain comment intégrer des routines assembleur dans un programme en
C et inversement (si, si, ça peut être utile !). D'ici là, je vous souhaite un bon mois
en notre compagnie.
|