1

Bonjour,
JE voudrais savoir comment on fait pour utiliser les fonctions d'une librairie écrite en assembleur dans mes programmes en C.

2

3

En fait c'est pour adapter la librairie i2clib qui est faite pour ti92 a la ti89 (comme avait fais Orion) c'est donc une librairie dynamique. J'ai la librairie et le header mais des que j'inclut se header dans mon fichier c j'ai plein d'erreur de compilation... Pour le header les fonctions doivent bien etre déclarées ainsi:
malib::ma_fonction equ malib@xxxx ?

4

5

Oki donc il faut que j'écrive les prototype des fonctions en C mais coment je fais le liens avec les fonctions asm?

6

calculator (./3) :
Pour le header les fonctions doivent bien etre déclarées ainsi: malib::ma_fonction equ malib@xxxx ?


Non. C'est pour l'utiliser en asm.

Exemple de lib asm:
genlib::init_screen		EQU	genlib@0049
genlib::init_dscreen		EQU	genlib@0002

Equivalent en C:
#undef gl_init_screen
#define gl_init_screen(scr,hd) \
  asm("jsr genlib__0049; move.l %%a0,(%0); move.w %%d0,(%1)" :: "a" (scr), "a" (hd) : "d0", "d1", "d2", "a0", "a1")
#undef gl_init_dscreen
#define gl_init_dscreen(dscr,hd) \
  asm(" jsr genlib__0002; move.l %%a0,(%0); move.w %%d0,(%1)" :: "a" (dscr), "a" (hd) : "d0", "d1", "d2", "a0", "a1")


Exemple plus facile:
ASM:
genlib::init_plane		EQU	genlib@0006


C
#define gl_init_plane               genlib__0006
PLANE *gl_init_plane(unsigned char map[] A3, SPRITE_16 tile[] A4, short sizeX D3);


avec
#define D0 asm("d0")
#define D1 asm("d1")
#define D2 asm("d2")
#define D3 asm("d3")
#define D4 asm("d4")
#define D5 asm("d5")
#define D6 asm("d6")
#define D7 asm("d7")

#define A0 asm("a0")
#define A1 asm("a1")
#define A2 asm("a2")
#define A3 asm("a3")
#define A4 asm("a4")


Comme tu peux voir il faut donner en plus l'information sur comment on utilise la fonction.
Le premier cas est plus dur car il y a plusieurs arguments de retour retournées par registre qu'il faut remontre dans des variables dont on passe l'adresse.
Le second est plus simple car il suffit de spécifier le type et dans quel registre l'entrée se situe pour la fonction, et de savoir que ce qu'elle retourne se trouve dans a0 (qui est le registre utilisé par la convention C pour retourner des pointeurs. d0 pour tout autre chose sauf des flottants qui sont encore à à part).

7

Oki merci PPHD je comprends mieux.

8

Euh, encore une petite question ou plutot un petit probleme, quand je compile en ligne de commande avec une librairie statique quand j'execute sur la ti j'ai KERNEL required
et quand je compile avec l'ide j'ai "Program declared as 'nostub' contains startup sections." en warning et "Library calls are not supported in this mode." comme erreur.
Ca doit etre lié a la librairie mais je ne sais pas ce que j'ai oublié j'ai mis dans ma librairie:
	section ".data"
	xdef 	_nostub
	include	"OS.H"

	xdef	i2clib@0000
	xdef	i2clib@0001
	xdef	i2clib@0002
	xdef	i2clib@0003
	xdef	i2clib@0004
	xdef	i2clib@0005


et j'ai fais une archive avec la commande tiggc -ar ...

9

Tu ne dois pas faire un nostub mais un kernel, autrement ca ne marchera pas.

10

11

Mais ce que je comprends c'est que si j'utilise une librairie statique je ne devrai pas avoir besoin d'un Kernel??
En fait le problème c'est que je ne connait pas la ligne de commande pour inclure une archive a la compilation

12

13

Donc je récapitule, je creer l'archive contenant la librairie statique i2cli.a
Ensuite je doit creer le fichier objet de mon programme en c incluant le header i2clib.h (écrit comme me la précisser PpHd) j'obtient main.o
ffectue le link en faisant tigcc -ld main.o Et en dernier j'e
calls are not supported in this mo de.Mais la le problème c'est que j'obtient D:\PROGRA~1\TIGCC\LIB\tigcc.a: Error: Library

Voici la liste des fichiers de mon projet

tromb Fichier joint : I2CLib.asm
tromb Fichier joint : i2clib.h
tromb Fichier joint : main.c

14

Il faut modifier la source pour qu'elle fonctionne en tant que librairie statique. En l'occurrence, il faut modifier les noms réservés i2clib@0000 en autre chose, par exemple i2clib0000, ou alors directement le nom que la fonction est censée avoir en C, ça t'éviterait les bidouilles du genre #define adress i2clib__0002.

D'ailleurs, ça:
#define start() asm("jsr i2clib__0000")
#define stop()  asm("jsr i2clib__0001")

c'est une très mauvaise idée, il vaut mieux déclarer start() et stop() comme des fonctions sans arguments et retournant void, c'est beaucoup plus propre. De plus, ton code actuel est incorrect parce que tu ne marques pas les registres détruits dans ton asm inline; si tu déclares ça comme une fonction normale, GCC sait que %d0-%d2/%a0-%a1 peuvent être détruits.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

15

calculator (./11) :
Mais ce que je comprends c'est que si j'utilise une librairie statique je ne devrai pas avoir besoin d'un Kernel??


Bug du linkeur qui voit une exportation externe là où elle est résolue. Faut passer en kernel donc. (Projet mode KERNEL).

16

PpHd (./15) :
Bug du linkeur qui voit une exportation externe là où elle est résolue. Faut passer en kernel donc. (Projet mode KERNEL).

Non, faut faire ce que je décris dans le message ./14.

Et 2 autres trucs:
1. section ".data" au début des fichiers A68k ne sert plus depuis TIGCC 0.95 (c'était un workaround pour les vieux linkers de TIGCC <= 0.94) et c'est même activement nocif parce que ça empêche à l'optimisation linker de fonctionner sur le fichier (parce qu'il croit que ce sont des données => non optimisable), donc tu devrais supprimer cette ligne.
2. Ce serait bien de penser aux systèmes de fichiers sensibles à la casse, donc c'est OS.h ou os.h (l'un est un symlink sur l'autre dans TIGCC/*nix), pas OS.H.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

17

Merci des réponses désolées si ces sujets ont déja été posée ou si elles paraissent logiques,
J'ai changer les noms des librairies (remplacé @ par __) et ca marche, mais je pense avoir une erreur avec l'appel asm de OSlinkReset. je vais le remplacé par la fonction c.

18

Normalement les noms de type i2clib__0000 (1 à 8 lettres, 2 underscores, 4 chiffres hexadécimaux) sont aussi réservés (c'est une deuxième manière d'écrire i2clib@0000), utilise plutôt un identifiant normal (ou à la limite i2clib_0000 avec un seul underscore, mais je ne vois pas trop l'intérêt de garder un nom sous cette forme).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité