1

Je suis en train de faire un prog avec TIGCC qui inclut des fonctions ASM. Le problème est que certaine de mes instructions ont l'air incorrectes:

exemple:
move.w 4(a7),%d0
me met le message "Parse error: statement "move.w 4(a7),%d0" ignored"

et en cas général:
a chaque fois que j'ai x(an) dans une de mes instruction ASM

Je ne suis pas tres familiarisé avec cette forme d'assembleur, c pour ca que je ne vois pas mon erreur.

J'attend avec impatience votre aidesmile

2

Bon, en fait j'ai trouvé mon erreur. Par contre, il y a un truc que je ne sais pas, c comment passer des paramètres par la pile et non par registre...

Car ma fonction ASM a besoin de paramètres veanat de la pile et non des registres dn et an!

Help me!!!

3

faut envoyer vers a7 (a7 est le pointeur de pile), et le décrémenter

pr envoyer un short valant 25 :
move.w #25,-(a7)
pr une chaine, ça doit être quelque chose du style
pea ma_str(pc)
(il me semble)

et une fois la fonction appellé, il faut penser à nettoyer la pile...
quelque chose du style
lea 2(a7),a7
ou lea 4(a7),a7 dans le cas de la chine (une ppinteur fait 4 octets)
ou plus si tu as plus de paramètres


(heu, c vite dit... mais je connaois pas trop l'asm)
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

4

Ca, je le savais dejasad

Je voudrais que TIGCC le face tout seul comme un grand! CC le fait bien alors pourquoi pas TIGCCconfus

5

tu programmes en C ?

arf, je croyais que ct en ASM que tu codais, vu qu'on est dans la partie ASM....
heu, TIGCC (j'ai pas testé la dernière version) passe nikel les params (du moins, ça marchait nikel il y a 2/3 versions de cela), que ce soit par la pile, ou par les registres, chez moi...
dl la dernière version http://tigcc.ticalc.org
et regarde tes options de compilation, c peut-être ça qui foire
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

6

cf post 1:"Je suis en train de faire un prog avec TIGCC qui inclut des fonctions ASM"

j'ai dit inclut en voulant dire avec asm("...")

De plus, j'ai TIGCC 0.94 beta 19

7

La dernière version de TIGCC passe par défaut les paramètres sur la pile, il me semble what
Tu n'as pas touché aux options de compilation ?
Et puis, tu es sûr que les arguments sont vraiment passés par registres dans ton programme ??
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

8

Si tu veux avoir les paramètres sur la pile, il faut utiliser une vraie fonction, pas de l'assembleur inline à opérandes C.

Par exemple:

__attribute__((stkparm)) extern int addition(short x, short y);

asm("addition:
move.w 4(%a7),%d0
add.w 8(%a7),%d0
rts")


(Le __attribute__((stkparm)) est le standard normalement, mais je le mets quand-même au cas où tu voudrais compiler ton programme avec -mregparm.)
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é

9

Kevin> Merci, ca marche super biengrin

10

Et comment on fait pour se passer d'AS?
On peut insérer de la même manière des fonctions en A68k dans un programme en C?
avatar
;)

11

Si tu parle de CC et de AS, CC reconnait:

...

#asm
;ton code assembleur...
#endasm

...

En plein milieu d'un programme en C. MAIS, CC ne fonctionne pas sans AS. CC n'est q'un interpreteur qui converti ton code C en asm (regarde le fichier mainasmsrc si t pas convaincu)
Il faut ensuite lancer AS pour tranformer le tout en executable...smile Simple!

Dans mais fonctions TIGCC pour CC, tu verra toujour:

#asm
_NomFonction:
;mon code de fonction...
#endasm

extern type_retour NomFonction (...);

Ca répond a ta question??

12

> CC n'est q'un interpreteur

Il ne faut pas exagérer picol
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

13

Il ne fait que convertir en ASM. Dite-le moi si je me trompe...

CC: le compilateur
AS: l'assembleur

14

Jarode> Non je parlais de GNU AS en fait. Dans TIGCC quand on veut insérer de l'assembleur, Kevin et la doc de TIGCC ne donnent que des exemples en mettant du GNU AS et j'aime vraiment pas. Enfin je préfère l'assembleur A68k.

Kevin Kofler>
Kevin Kofler a écrit :
Par exemple:

__attribute__((stkparm)) extern int addition(short x, short y);

asm("addition:
move.w 4(%a7),%d0
add.w 8(%a7),%d0
rts")


Au fait Kevin ça ne marche pas car si les arguments sont des short, sur la pile il y aura l'addresse de retour à la fin de la sous-routine sur 4 octets, ensuite le 1er argument sur 2 octets, et le 2ème sur 2 octets. donc il faudrait mettre:

__attribute__((stkparm)) extern int addition(short x, short y);

asm("addition:
move.w 4(%a7),%d0
add.w 6(%a7),%d0
rts")


squale92>
squale92 a écrit :
et une fois la fonction appellé, il faut penser à nettoyer la pile...
quelque chose du style
lea 2(a7),a7
ou lea 4(a7),a7 dans le cas de la chine (une ppinteur fait 4 octets)
ou plus si tu as plus de paramètres


Je ne veux pas du tout avoir l'air méchant mais j'espère que tu ne mets pas ça dans ton tutorial. Même si A68k optimise je pense qu'il est mieux de mettre:
addq.l #x,a7 pour x inférieur ou égal 8 et
lea x(a7),a7 pour x supérieur à 8
Par exemple, si tu ne fais pas ça avec AS sur calculatrice, il ne te l'optimisera pas.

[EDIT: Faute de frappe]
avatar
;)

15

De plus, AS ne fait pas ca:

move.l ($c8).w,a0

si on ne présise pas (...).w, alors, il ne le fera pas tout seul.

En général, dès que l'on a $xxxx il faut mettre ($xxxx).w

16

C'est uniquement une réponse subjective qu'on peut apporter à cette question.

Moi je trouve que c'est plus qu'un convertisseur : il gère l'adressage des variables, la pile, le passage d'arguments, les structures de données qui sont des choses très abstraites, il optimise, etc.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

17

Thibaut> si tu parle de CC, quand tu dit qu'il optimise, c vite ditgrin

18

Et puis en fait ça y est j'ai compris comment insérer de l'ASM en A68k grâce à l'exemple de Kevin que j'ai adapté.
En fait il faut mettre
__attribute__((stkparm)) extern short addition(short x, short y);
dans le code en C (ça marche même sans le extern dans mon exemple, donc je sais pas trop si il est nécessaire). Le __attribute__((stkparm)) est nécessaire au cas où on compilerait en -mregparm.

Et ajouter un fichier A68k dans le projet en mettant:
section ".data"
xdef addition
addition:
move.w 4(a7),d0
add.w 6(a7),d0
rts


Voilà. J'ai appris quelque chose aujourd'hui c'est cool! grin
avatar
;)

19

moi aussi du coupgrin

20

En effet, c'est la méthode à utiliser.
Mais je te signale que tu peux passer le paramètre --register-prefix-optional à GNU as si les % devant les registres te gènent. Le problème, c'est que ça pose problème si tu appelles des variables C a1, pc ou qqch. comme ça.

D'ailleurs, il y a aussi d'autres paramètres intéressants sous http://tigcc.ticalc.org/doc/gnuasm.html#SEC12.
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é