1

comment fait-on l'équivalent d'un #define en C avec GNU as ?
le but c'est de remplacer les registres par des noms plus explicite genre :

#define VARIABLE %d0

J'ai essayé avec :

.equ VAR, %d0

mais c'est pas ca tsss

J'y comprends rien à ces assembleurs !!

2

.equr VAR,%d0

[EDIT: En fait non, GNU as n'accepte pas ça. On ne peut pas faire un equate avec un registre sous GNU as.]
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é

3

sad Marche pas

Je préfère mettre le code complet au moins vous voyez si ca vient pas d'ailleurs :

void fonction(void *src_adr,void *dst_adr)
{
asm(
".equr TEST,%d0
move.l TEST, %[dst_adr]"
: [src_adr] "=m" (src_adr) ,
[dst_adr] "=m" (dst_adr)
);
}

4

Effectivement, ça ne marche pas. Tu dois mettre %%d0 explicitement, tu ne peux pas faire un equate. (Et il faut doubler le % parce que c'est de l'assembleur inline à opérandes C.)
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é

5

Dommage, merci smile

Oh fait, dans la doc il est indiquer de séparer les variables utilisées dans l'asm par des ':'
et dans mon cas, j'ai mis sans faire gaffe une ',' et ca ne m'a pas geullé dessus,
sauf quand j'ai voulu corriger et mettre ':' là ca marchait plus lol

ca me donne mal à la tête tout c'est truc lol

6

Il faut ',' pour séparer les variables de même type et ':' pour séparer entrées, sorties et clobbers.

L'assembleur inline est très compliqué, je conseille de l'éviter pour débuter. (Il vaut mieux mettre des fonctions en assembleur dans un .s à part, il y a beaucoup moins de pièges comme ça.) Une grande partie de l'assembleur inline que je vois, même codé par des programmeurs experts, est incorrect.
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é

7

FYI, .equ et .set sont équivalents.

8

Ouai, j'ai vu ca dans la doc, mais d'après Kevin, GNU as ne fait pas ce genre de chose sur les registres :/

Je veux bien essayer de passer par un fichier .s à part, mais je ne sais
pas comment appeler une fonction asm depuis le C gol

9

comment appeler une fonction asm depuis le C

Il faut que tu crées un prototype C pour ta fonction ASM smile
Voir, entre bien d'autres, ExtGraph, très majoritairement écrite en ASM mais faite pour être utilisée à partir du C comme de l'ASM.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

10

c'est du genre short (asm "%d0") fonction ( void* asm "%a0"); ou trucs dans le genre.

11

short fonction (void * arg asm("%a0")); rend 16 bits dans d0
short * fonction (void * arg asm("%a0")); rend un pointeur dans a0
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

12

Ok, comme ca c'est plus clair smile

Et pour récupérer une valeur passée en paramètre ?

13

Hmm, donne un exemple plus précis wink
En C, on ne peut retourner qu'une valeur (sur TI-68k, soit dans d0 soit dans a0). Les autres passent par des pointeurs.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

14

Bah, là tu lui indiques comment retourner une valeur. Lui te demande comment passer un paramètre à la fonction...
stfox, dans l'exemple de Lionel, il semble y avoir un paramètre à la fonction de type void * dont l'adresse est dans a0.
avatar

15

Et pour récupérer une valeur passée en paramètre ?


Si c'est passé dans la ligne de commande, t'as le choix : les fonctions de estack.h, compatible avec AMS, mais c'est la merde.

Si c'est PedroM only, tu as : short main (int argc, const char *argv[]);

t'as donc le nombre de paramètres passés à 4(sp), et la table des pointeurs vers chacun d'eux à 4+2(%sp)

Mais je sais pas du tout si c'est la réponse que t'attends, ta question est vague. grin


ah ui,, je viens de relire sa question, ya 9 chances sur 10 que je sois dans les choux sick mais je laisse pour son info

16

Merci pour vos réponses, alors je vais être plus précis smile

Je veux appeler une routine en asm depuis du C, j'ai 2 routines à appeler dont
voici les prototypes en C :

void fonction1(void *a, void *b, unsigned long c);

unsigned short fonction2(void *a, unesigned long b, void *c, unsigned long *d);

J'imagine qu'il faut créer un .h avec ces prototypes,
mais dans le fichier asm, je ne sais pas comment récupérer n'y rendre les arguments mourn

EDIT : Je précise que comme je passe direct aux fichiers asm, je vais utiliser A68k
qui semble mieu smile

17

mais dans le fichier asm, je ne sais pas comment récupérer n'y rendre les arguments mourn

Rendre les arguments: comme je l'ai écrit, tu dois rendre l'argument dans d0 (si c'est un type entier) ou a0 (si c'est un pointeur).
Récupérer les arguments: le compilo les placera selon la convention d'appel que tu lui demandes grin

Il y a trois conventions d'appel:
* (la plus lente et la plus grosse) tout passer par la pile, en déclarant la fonction __attribute__((__stkparm__)) (comme ça, ça fait une fonction __stkparm__ même si l'option de compilation -mregparm est activée). Martial en a touché deux mots en ./15: les arguments commencent à un déplacement [4 + les registres sauvegardés + l'espace temporaire] par rapport à sp;
* passer par les registres en laissant le compilo faire tout seul l'allocation: __attribute__((__regparm__(n))). Je n'aime pas ça, je préfère:
* passer par les registres en forçant le compilo à faire ce qu'on veut (registres explicites). C'est la syntaxe que j'ai postée en ./11, qui est utilisée dans ExtGraph.

(à noter que si une fonction a plus de cinq ou six de paramètres / utiliserait plus de 3 registres d'adresse et/ou plus de 4 registres de données, il est préférable d'en mettre certains sur la pile. Là aussi, ExtGraph contient de telles fonctions)
EDIT : Je précise que comme je passe direct aux fichiers asm, je vais utiliser A68k qui semble mieux smile

Cet avis n'est pas universellement partagé grin
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

18

Tant pis, il faut que je me fixe un assembleur, sinon je m'en sort plus lol

Alors, ca avance, mais qu'elle est la directive pour indiquer que le code
de la fonction se trouve dans le fichier asm ?

J'ai une erreur "Unresolved reference to (fonction)"

EDIT :

j'ai trouvé, dites mois si c'est bien ca qu'il faut mettre au début du fichier asm :

xdef fonction

fonction :
... instructions assembleur ...

19

A68k n'est pas mieux, c'est un vieil assembleur qui n'est présent plus que pour la compatibilité avec les anciens programmes et qui va bientôt disparaître de TIGCC pour des raisons de licence.
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é

20

Comment fait-on un '#define CONST 6' sous A68k ?

21

CONST equ 6

Mais c'est possible aussi avec GNU as:
.equ CONST,6

Et une fois de plus, je te signale que A68k ne sera bientôt plus disponible et qu'il est donc une mauvaise idée de l'utiliser pour de nouveaux programmes!
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é

22

Oui oui m'sieur, c'est juré je referais plus smile

Mais là j'ai commencé sous A68k, je me suis tellement pris la tête que
j'aimerais au moins terminer ca avant de me ... reprendre la tête lol


Merci smile

23

Ben écoute on fait un truc : tu postes ton code écrit pour A68k, je te montre les différences pour le porter sous GNU as. smile

J'ai écrit des années pour A68k, des années pour GNU as (pour lequel j'écrit encore tous les jours grin). Vu la toolchain et les coups en traitre que te balance A68k quand tu connais pas ses bugs, je te conseille vraiment GNU as. Mais tu fais ce que tu veux. Ce que je te propose, c'est juste de te montrer quoi faire pour passer de l'un à l'autre, tu verras c'est über-simple. grin

Et pourtant, Dieu sait si j'aime beaucoup A68k aussi, avec ses labels locaux géniaux entre autres, mais Kevin le maintient plus. Il déconne notamment sur machine 64 bits, est capable d'assembler des instructions inexistantes, et bug un peu dans tous les sens...

xdef fonction

fonction : 


Ce qui donnerait avec GNU as :
.xdef fonction

fonction : 

Tu vois, c'est pas la mort. grin

24

lol si il ne s'agit que d'un point à rajouter, alors ca me va mdr

Merci pour la proposition, c'est noté, t'inquiet que je vais pas oublier grin ,
mais sur l'instant T, je veux finaliser STZ en asm qui devrait .... décoiffer sévère fou
Les résultats en compression sont affolant, t'imagine mon impatience à debugguer
la décompression ! boing

25

Je comprends parfaitement, t'inquiète pas. hehe

note -> Kevin maintient encore A68k, mais juste ce qu'il faut on va dire. Certains bugs n'ont jamais été corrigés, mais l'adaptation 64 bits devrait arriver.