PDA

Voir la version complète : [NDS][Aide] inserer du code ASM dans un source C pour le ARM7


Japi
01/02/2006, 20h31
SLt!

J'ai besoin d'aide svp.
J'arrive pas à inserer mon morceau d'asm dans un source C sous Vham pour l'arm7 de la GBA. j'ai essayé plusieurs trucs comme

asm(...);

__asm{...};

asm(".intel_syntax noprefix
...
\n");*/

et d'autres mais rien.

J'ai une petite question au passage, perso, je connais l'asm intel. Est-ce que les instructions pour le ARM7 sont identiques? ou trouver de la doc la dessus, svp.

Merci.

Mollusk
01/02/2006, 20h39
Fais gaffe, Nes va te filer une doc en russe...

Sinon, tu as essayé sous vham de rajouter un fichier asm pur et d'utiliser une de ses fonctions ?

edit : je suis tomber sur ca : http://groups.yahoo.com/group/hamdev/message/3581?viscount=100
je sais pas si ca t'aide

Japi
01/02/2006, 21h17
ok merci, je suis partit sur le site de playeradvance l'ancien, j'ai trouvé ça:

http://www.playeradvance.org/old/index.php?showtopic=9980

si ça peut aider d'autres personnes...


Maintenant, je suis encore pas sortit du truc, ça marche le ASM inline mais ils connaient pas mes instructions... sniff

Japi
02/02/2006, 18h49
bon alors, je continus si ça interresse quelques codeurs :

le datasheet du arm7 on le trouve sur le site de gbadev.org à la rubrique docs.
Ya tout dedans, c'est la doc constructeur du cpu donc forcement ya tout de chez tout.

Il faut ecrire comme ça pour faire de l'inline (soit intégrer quelques instructions dans du code C):

Code en C

asm("instruction1 ; instruction 2 ; ...");

Code en C

thoduv
04/02/2006, 11h50
Et pour passer les arguments dans des registres au moment du code, tu fais comment ?

MIKEGBA
04/02/2006, 12h32
moi , j'ai une question, comment on fait pour mettre du C inline dansun code source full ASM ???? :topsy:

Nesgba
04/02/2006, 12h47
moi , j'ai une question, comment on fait pour mettre du C inline dansun code source full ASM ???? :topsy:
tu compille ton bout de code en c et tu fait un copier coller puis tu optimise parcque ca sera pas joli joli :p

Japi
04/02/2006, 14h39
Et pour passer les arguments dans des registres au moment du code, tu fais comment ?

Rhaaa, me pose pas cette question, j'arrive pas à passer de variables "C" dans le code asm. Ca fait 3j que je galere dessus, j'ai lu des millions de trucs, j'ai testé des 100enes de fois, rien rien rien.
J'arrive à faire tourner à peut pres ce que je veux sans faire intervenir de variables "C" sauf bizarrement quand je luis passe un truc genre ldr r1, =PaVideoColor;
ben là, il me prend le tableau de pixel et c'est genial, je dessine une image tranquille.
Par contre, obligé de faire Ldr r0,=0x600000000 (ya ptet trop de zero) pour lui donner l'adresse du buffer video, parce qu'il la prend pas en faisant ldr r0,=videobuffer.
J'ai essayé pleins d'ecriture différente en les combinant aussi avec des # des = des _ des [] des () des =#_$%*û mais rien ^^
j'ai testé le truc des parametres constraints je sais plus quoi à la fin :"=r" output:"r" input:blablabla mais pareil
j'ai testé avec des variables locales, globales, des constantes, des static, des !!!

Je craque, je change de technique, plus d'asm inline, je passe à l'asm normale.

MIKEGBA
04/02/2006, 15h17
pour le video buffer, tu peux faire

mov r0,#0x6000000 ( y'a 6 zero au fait !!! :lol: )

si t'es en mode 4, enfonction du buffer, tu rajoute ou pas #0xa000

tu test ton registre discpnt, pour connaitre quel buffer est utilisé, tu met


addeq r0,r0,#0xa000



pour les variables globales, normalement, tu charge comme ça

ldr r0,=VITESSE_VOITURE , ce qui va faire pointer r0 sur l'adresse de ta variable, sans en prendre le contenu.




edit : pour ton probleme de videobuffer

tu fais donc :

ldr r0,=videobuffer
ldr r0,[r0]




ensuite ldr r0,[r0], charge dans r0 la valeur de ta variable.


si VITESSE_VOITURE était un tableau, tu as donc l'adresse de début de ton tableau, et tu charges les donner grace à des registres qui te servent de pointeurs

par exemple :


mov r1,#0x02


ldr r2,[r0,r1] te donneras donc la troisieme valeur de ton tableau, si ce sont des char

si tes valeurs sont des short ( 16 bits ), tu fais dabord un décalage à gauche

mov r1,#0x02

ldr r2,[r0,r1, lsl #1]

je sais pas si j'ai fait avancé le shmilblik ?

Japi
04/02/2006, 15h27
ben ouais, en gros, ça je sais dejà, je fais tout pareil, le mov ou le ldr (le mov va plus vite là) pour le buffer video, le chargement d'un tableau par l'adresse, le decalage de bit sur la gauche pour les valeurs 16bits et tout.
Puisque en gros, j'arrive à afficher une image en mode 3 donc, la base, c'est ok.
J'ai lu tout le pdf sur le ARM7TDMI partie programmation pour y arriver quand même ^^

Par contre, tu as ecris:

pour les variables globales, normalement, tu charge comme ça
ldr r0,=VITESSE_VOITURE , ce qui va faire pointer r0 sur l'adresse de ta variable, sans en prendre le contenu.
ensuite ldr r0,[r0], charge dans r0 la valeur de ta variable.

alors ça, j'avais testé et moi, ça marchait pas. enfin la syntaxe est ok, ça compile mais rien apres, je recuperais pas la bonne valeur.
Pour les tableaux, bizarrement ouais, ça marche puisque je recupere les pixels d'un tableau créer par GFX2GBA mais pas une donnée (un u32 par exmple) d'une pov variable globale toute pourrite ^^

Je vais retesté demain (là pas le temps), si ça marche (j'ai ptet oublié un truc, rajouté un symbole ou je sais pas quoi, j'ai tellement testé de trucs), ça va gerer!!!!!!!!!!! et t'auras le droit à ma plus grande gratitude ^^

MIKEGBA
04/02/2006, 16h02
pour les variables globales, normalement, tu charge comme ça
ldr r0,=VITESSE_VOITURE , ce qui va faire pointer r0 sur l'adresse de ta variable, sans en prendre le contenu.
ensuite ldr r0,[r0], charge dans r0 la valeur de ta variable.

alors ça, j'avais testé et moi, ça marchait pas. enfin la syntaxe est ok, ça compile mais rien apres, je recuperais pas la bonne valeur.



alors ça dépend aussi de ta valeur si elle 8,16 ou 32

si c'est du 8 bits, il faut pas utiliser ldr , mais ldrb !!!! ldr va te charger d'un coup 4 valeurs de 8 bits dans un registre de 32 bits !!!

ldrb ne te chargera que les 8 bits d epoids faible

si ta valeur est signée, utilise ldrsb !!!

MAIS ATTENTION, dans le cas d'un ldrsb ou ldrsh ( signé 8 ou 16 bits ), tu ne peux plus charger de valeur de tableau de la meme facon, car tu ne peux pas integrer de decalage directement dans l'instruction elle meme:

exemple:

tu veux faire ldrsh [r0,r1,lsl #1] ---> on ne peut pas

il faut faire en 2 instructions:

mov r1,r1, lsl#1
ldrsh [r0,r1]


autre source de probleme: l'alignement !!! avec un ldr , il faut etre aligné sur 4 octets, sinon tu vas recuperer forcement une valeur eronée

Japi
05/02/2006, 05h36
je viens juste de rentrer, je dors, et je test.

J'utilise que des u32 non signé pour faire de l'asm, histoire de pas etre embeter. Esperons que ça marche demain ^^ j'en reve dejà, faut dire, il est l'heure pour ça.

thoduv
05/02/2006, 12h10
C'est décidé, j'apprends serieusement l'ASM ! :D

Sababo
08/10/2008, 20h40
Bonjour

je cherche moi aussi a mettre du code assembleur dans mon programme c.
Et surtout a mettre des valeur stocké dans un registre dans une variable c.
Donc voila mon pti bout de code.


int pile = 0;
asm ("mov pile,r1;");


J'ai fait ce code d'après cette discussion et les spéc de arm pour la nds http://nocash.emubase.de/gbatek.htm

Malheuresement, j'ai une erreur au moment de la compilation.

Error: ARM register expected -- `mov pile,r1'


J'ai trouvé dans les spéc de GCC que l'on peux faire comme ça :

asm ("mov %0, r1; "
:"=r"(pile)
);


Celui ci compile bien , mais j'ai pas l'impression que ça marche (surtout quand je veux affecté a un registre une valeur).

Mon but final est de recuperer l'adresse ou pointe un registre.
Et faire pointer un registre vers une autre zone (une varaible).

Pouvez-vous me dire comment faire ?

Merci