Derniers sujets
Qui est en ligne ?
Il y a en tout 1 utilisateur en ligne :: 0 Enregistré, 0 Invisible et 1 Invité Aucun
Le record du nombre d'utilisateurs en ligne est de 29 le Mer 25 Fév 2015 - 14:01
Connexion
Statistiques
Nous avons 241 membres enregistrésL'utilisateur enregistré le plus récent est ben_frog
Nos membres ont posté un total de 8921 messages dans 811 sujets
passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
4 participants
Forum Oric :: Forums :: Forum Public :: Programmation en C
Page 1 sur 1
passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
Je test l'inline assembleur dans du C (osdk) à l'aide de l'instruction asm("");.
à ma bonne surprise ça fonctionne de façon simple et c'est super pour optimiser des petites routines en c.
Ma question et que si je veux passer une variable du c à l'asm , il ne l'accepte pas à la compilation. Je ne sais si c'est possible de le faire ...!?
j'ai essayé le code suivant mais ça ne passe pas à la ligne du val.
à ma bonne surprise ça fonctionne de façon simple et c'est super pour optimiser des petites routines en c.
- Code:
asm("pha;lda #65; sta 48000; pla;");
Ma question et que si je veux passer une variable du c à l'asm , il ne l'accepte pas à la compilation. Je ne sais si c'est possible de le faire ...!?
- Code:
unsigned char val=0x40;
asm("pha;lda val; sta 48000; pla;");
- Code:
D:\osdk\sample\c\map\MAIN.s(715): 0e17:Label 'val' not defined
Break after 1 errors
ERROR : Build failed.
j'ai essayé le code suivant mais ça ne passe pas à la ligne du val.
- Code:
asm("pha;lda %1;"
"sta 48000;"
"pla;"
,val);
- Code:
asm("lda #%b",val);
Dernière édition par goyo le Ven 4 Jan 2019 - 14:37, édité 2 fois
goyo- Messages : 199
Date d'inscription : 02/05/2014
Age : 52
Localisation : Massy
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
There are many little details related to mixing C and ASM, but for your case the solution is to use underscore ('_') before the variable name in ASM.
Additionally I recommend to use global variables. As example:
This should work as expected.
If you want to pass a variable as argument to function then it's different and bit difficult.
Additionally I recommend to use global variables. As example:
- Code:
// global variable
unsigned char val=0x40;
// in function
void test(void)
{
asm("pha;lda _val; sta 48000; pla;");
}
This should work as expected.
If you want to pass a variable as argument to function then it's different and bit difficult.
iss- Messages : 112
Date d'inscription : 30/10/2014
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
iss a écrit:There are many little details related to mixing C and ASM, but for your case the solution is to use underscore ('_') before the variable name in ASM.
Additionally I recommend to use global variables. As example:
- Code:
// global variable
unsigned char val=0x40;
// in function
void test(void)
{
asm("pha;lda _val; sta 48000; pla;");
}
This should work as expected.
If you want to pass a variable as argument to function then it's different and bit difficult.
Wonderfull , thank you
goyo- Messages : 199
Date d'inscription : 02/05/2014
Age : 52
Localisation : Massy
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
.. et comment tu fais pour passer une valeur d'adresse ....
- Code:
unsigned int val=0xbb80;
asm("pha;"
"lda #$40;"
"sta _val;"
"pla;");
goyo- Messages : 199
Date d'inscription : 02/05/2014
Age : 52
Localisation : Massy
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
Bein dites donc, je ne savais même pas que le compilateur C supportait l'assembleur en ligne...
On en apprend tous les jours
On en apprend tous les jours
_________________
Dbug- Messages : 248
Date d'inscription : 06/01/2013
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
- Code:
unsigned int val = 0xbb80;
void main(void)
{
asm("pha; lda _val; sta patch_address+1; lda _val+1; sta patch_address+2; lda #'@';")
asm("patch_address");
asm("sta $1234; pla;");
}
iss- Messages : 112
Date d'inscription : 30/10/2014
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
Mais oui bien sûr ! Of Course ISS !
le code en assembleur supporte les mêmes règles que s'il est dans un .s. the sames rules apply as if you were in a .s routine.
Les variables du code C sont visibles dans l'assembleur à condition d'ajouter un _ devant...
le code en assembleur supporte les mêmes règles que s'il est dans un .s. the sames rules apply as if you were in a .s routine.
Les variables du code C sont visibles dans l'assembleur à condition d'ajouter un _ devant...
_________________
>++++++++++[<++++++++>-]<.>++++++[<++++>-]<+.----.+++++++++++++..-------------.[-]
drpsy- Messages : 208
Date d'inscription : 20/07/2014
Age : 52
Localisation : Lagny sur Marne
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
iss a écrit:This works for me. It's self modifying code but I don't have other better idea...
- Code:
unsigned int val = 0xbb80;
void main(void)
{
asm("pha; lda _val; sta patch_address+1; lda _val+1; sta patch_address+2; lda #'@';")
asm("patch_address");
asm("sta $1234; pla;");
}
Je trouve ça un peu lourd mais effectivement ça fonctionne bien. Merci beaucoup iss.
Je suis quand même curieux de savoir ce qu'il met dans la valeur _val lors d'une instruction "sta _val;" !? car ça passe quand même à la compil.
goyo- Messages : 199
Date d'inscription : 02/05/2014
Age : 52
Localisation : Massy
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
Probablement la valeur courante du registre A.
Je n'ai pas regardé comment était implémenté la commande asm() dans le compilo C, donc aucune idée de ce que ca fait vraiment, je ne connaissais pas avant que vous en parliez
Je n'ai pas regardé comment était implémenté la commande asm() dans le compilo C, donc aucune idée de ce que ca fait vraiment, je ne connaissais pas avant que vous en parliez
_________________
Dbug- Messages : 248
Date d'inscription : 06/01/2013
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
Bon, j'ai regardé dans le compilo, et la fonction asm utilise % pour specifier les variables:
- Code:
char i;
for (i=0;i<256;i++)
{
asm("lda %i:tax:and #7:ora #16:sta $bb80+40,x");
}
_________________
Dbug- Messages : 248
Date d'inscription : 06/01/2013
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
Dbug a écrit:Bon, j'ai regardé dans le compilo, et la fonction asm utilise % pour specifier les variables:Suffit de regarder dans le code :p
- Code:
char i;
for (i=0;i<256;i++)
{
asm("lda %i:tax:and #7:ora #16:sta $bb80+40,x");
}
Merci Dbug,
Cependant, il n'affiche toujours pas le 'A' à l'écran (position $BB80)
apparemment ça va pour le passage d'une variable d'un octet seulement mais pour une de 16 bits ça se complique:
le contenu de j est de $BB41 au lieu de $BB80 si on l'interroge par un printf après avoir exécuté la ligne asm(); !?
il a l'air de s'emmêler les pinceaux ...
peut être que ASM() ne prend des variables que de 8 bits ?
- Code:
unsigned char i=0x41;
unsigned int j=0xbb80;
void main()
{
asm("pha; lda %i; sta %j;pla");
printf("\n");
printf("%j= %x \n\n",j);
printf("%i= %x \n",i);
}
- Code:
CAPS
ORIC EXTENDED BASIC V1.1
` 1983 TANGERINE
37631 BYTES FREE
Ready
CLOAD""
j= BB41
i= 0041
Ready
goyo- Messages : 199
Date d'inscription : 02/05/2014
Age : 52
Localisation : Massy
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
Bein oui, il a fait ce que tu lui à demandé, c'est a dire l'équivalent de ca:
Il n'y a que deux possibilités pour faire ce que tu veux:
- mettre une adresse absolute (et donc patcher le code)
- passer par de l'adressage relatif indexé y (donc recopier la variable en page zéro)
Personnellement je pense que l'utilisation de l'assembleur en ligne est vraiment très restreint, ca rend la code illisible, et ca limite sérieusement la syntaxe, au mieux ca peut faciliter l'appel de routines externes en facilitant le passage des paramètres, mais ca a peut pres tout
- Code:
var_i .byt $41
var_j .byt $80,$bb
lda var_i
sta var_j
Il n'y a que deux possibilités pour faire ce que tu veux:
- mettre une adresse absolute (et donc patcher le code)
- passer par de l'adressage relatif indexé y (donc recopier la variable en page zéro)
Personnellement je pense que l'utilisation de l'assembleur en ligne est vraiment très restreint, ca rend la code illisible, et ca limite sérieusement la syntaxe, au mieux ca peut faciliter l'appel de routines externes en facilitant le passage des paramètres, mais ca a peut pres tout
_________________
Dbug- Messages : 248
Date d'inscription : 06/01/2013
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
En fait en asm, il n'y a pas de type de données. Le processeur ne manipule que des octets de 8 bits à des adresses de la mémoire. Ce qui fait qu'une variable n'est qu'un pointeur (adresse mémoire) sur une case mémoire de 8 bits... pour manipuler des entiers sur 16 bits, il faut deux octets et faire traiter en passes par le processeur.
Pour stocker i à l'adresse pointée par j, il faut faire un adressage relatif indexé comme le dit dbug : sta (tmp0),x
Et précéder cela par un :
ldx #0 pour que x (l'index dans l'instruction précédente, qui désigne un registre du processeur) soit égal à 0.
Lda %j
Sta tmp0
Lda %j+1
Sta tmp0+1
Pour copier j (2 octets) dans une variable disponible de la page 0 (tmp0 a tmp6 sont des variables définies par le compilateur pour les calculs en C)
Pour stocker i à l'adresse pointée par j, il faut faire un adressage relatif indexé comme le dit dbug : sta (tmp0),x
Et précéder cela par un :
ldx #0 pour que x (l'index dans l'instruction précédente, qui désigne un registre du processeur) soit égal à 0.
Lda %j
Sta tmp0
Lda %j+1
Sta tmp0+1
Pour copier j (2 octets) dans une variable disponible de la page 0 (tmp0 a tmp6 sont des variables définies par le compilateur pour les calculs en C)
_________________
>++++++++++[<++++++++>-]<.>++++++[<++++>-]<+.----.+++++++++++++..-------------.[-]
drpsy- Messages : 208
Date d'inscription : 20/07/2014
Age : 52
Localisation : Lagny sur Marne
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
drpsy a écrit:En fait en asm, il n'y a pas de type de données. Le processeur ne manipule que des octets de 8 bits à des adresses de la mémoire. Ce qui fait qu'une variable n'est qu'un pointeur (adresse mémoire) sur une case mémoire de 8 bits... pour manipuler des entiers sur 16 bits, il faut deux octets et faire traiter en passes par le processeur.
Pour stocker i à l'adresse pointée par j, il faut faire un adressage relatif indexé comme le dit dbug : sta (tmp0),x
Et précéder cela par un :
ldx #0 pour que x (l'index dans l'instruction précédente, qui désigne un registre du processeur) soit égal à 0.
Lda %j
Sta tmp0
Lda %j+1
Sta tmp0+1
Pour copier j (2 octets) dans une variable disponible de la page 0 (tmp0 a tmp6 sont des variables définies par le compilateur pour les calculs en C)
merci à vous pour vos explications d'experts, effectivement ça marche comme ça.
c'est vrai que ça fait un peu lourd pour juste faire un poke($BB80),65;
je n'ose pas encore me mettre au fichier.s je suis trop débutant en assembleur.
- Code:
asm("pha;"
"ldx #0; "//pour que x (l'index dans l'instruction précédente, qui désigne un registre du processeur) soit égal à 0.
"lda %j;"
"sta tmp0;"
"lda %j+1;"
"sta tmp0+1;"
"lda #$41;"
"sta (tmp0,x);"
"pla;");
goyo- Messages : 199
Date d'inscription : 02/05/2014
Age : 52
Localisation : Massy
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
Juste pour la remarque : ton x est dans les parenthèses. C'est un autre mode d'adressage que celui que je voulais te donner.Pas dimpact ici puisque x vaut 0. Mais C'est moi qui me suis trompé. Il faut mettre y et non x et en dehors.
Du coup,
Ldy #0
sta (tmp0),y
Pilule bleue ou pilule rouge ?
Je ne te promets que la vérité...
Du coup,
Ldy #0
sta (tmp0),y
Pilule bleue ou pilule rouge ?
Je ne te promets que la vérité...
_________________
>++++++++++[<++++++++>-]<.>++++++[<++++>-]<+.----.+++++++++++++..-------------.[-]
drpsy- Messages : 208
Date d'inscription : 20/07/2014
Age : 52
Localisation : Lagny sur Marne
Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
Dbug a écrit:Bein oui, il a fait ce que tu lui à demandé, c'est a dire l'équivalent de ca:
- Code:
var_i .byt $41
var_j .byt $80,$bb
lda var_i
sta var_j
Il n'y a que deux possibilités pour faire ce que tu veux:
- mettre une adresse absolute (et donc patcher le code)
- passer par de l'adressage relatif indexé y (donc recopier la variable en page zéro)
Personnellement je pense que l'utilisation de l'assembleur en ligne est vraiment très restreint, ca rend la code illisible, et ca limite sérieusement la syntaxe, au mieux ca peut faciliter l'appel de routines externes en facilitant le passage des paramètres, mais ca a peut pres tout
merci Dbug, en utilisant le patchage et deux variables char pour l'adresse absolue ça marche :
- Code:
unsigned char val=0x41;
unsigned char adr_l=0x80;
unsigned char adr_h=0xBB;
void main()
{
val='B';
asm("ldx #0;"
"lda _adr_l;"
"sta _write+1;"
"lda _adr_h;"
"sta _write+2;"
"lda _val; "
"_write;"
"sta $1234,x;");
}
goyo- Messages : 199
Date d'inscription : 02/05/2014
Age : 52
Localisation : Massy
Forum Oric :: Forums :: Forum Public :: Programmation en C
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Jeu 21 Mar 2024 - 8:51 par Dom50
» carte mère Oric (re)tracée
Mar 5 Mar 2024 - 18:54 par kenneth
» Meurtre à Grande Vitesse
Dim 25 Fév 2024 - 5:09 par Iurius
» ORIC-1 sur LE BON COIN
Ven 23 Fév 2024 - 23:01 par Mcar
» ORIC ATMOS sur LE BON COIN
Dim 4 Fév 2024 - 12:06 par kiwilevrai
» Problème d'affichage des couleurs avec un Oric Atmos
Sam 27 Jan 2024 - 1:26 par pierbail
» Bienvenue dans le Forum des Oriciens
Mar 9 Jan 2024 - 12:33 par Dom50
» Rencontre avec Laurant Weill, co-fondateur de Loriciel, et mon garçon de 12 ans
Ven 29 Déc 2023 - 14:13 par Arcade-des-Monts
» Bonnes fêtes
Mar 26 Déc 2023 - 10:21 par Dom50
» Murders in Venice / Meutres à Venise
Sam 18 Nov 2023 - 22:44 par retroric
» Un clavier PS/2 pour tester un ORIC
Dim 27 Aoû 2023 - 9:49 par Voyageur
» Disquette 3" Sedoric
Mar 1 Aoû 2023 - 14:22 par AtomeX
» faire un 6502 avec des phototransistor
Dim 16 Juil 2023 - 17:26 par Voyageur
» Oricutron linux et DSK
Jeu 29 Juin 2023 - 18:34 par Voyageur
» No Problem !
Dim 25 Juin 2023 - 17:53 par Voyageur