Derniers sujets
» Annonces insolites
Aujourd'hui à 11:12 par Dbug

» Bus d'extension - accès à la RAM
Hier à 20:48 par fred72

» Oric High Score Challenge 2019 : c'est parti
Hier à 11:29 par Dom50

» L'ile oubliée
Jeu 21 Mar 2019 - 20:36 par Symoon

» Des propositions graphiques pour Oricutron
Jeu 21 Mar 2019 - 20:31 par laurentd75

» opération compliquée
Lun 18 Mar 2019 - 22:58 par laurentd75

» Novalight
Dim 17 Mar 2019 - 21:33 par Symoon

» Route en effet 3d
Dim 17 Mar 2019 - 18:37 par Dbug

» musique en c
Ven 15 Mar 2019 - 14:54 par laurentd75

»  Oric Atmos problème de sortie vidéo
Ven 15 Mar 2019 - 14:48 par kenneth

» 65c816 et dédicace à Fabrice F :)
Jeu 14 Mar 2019 - 11:20 par Jede

» cherche quelqu'un(e)(s) avec qui retravailler la rom basic 16 kos
Jeu 14 Mar 2019 - 10:45 par Jede

» Aux couleurs de l'Atmos
Jeu 14 Mar 2019 - 3:04 par Voyageur

» ORIC-1 sur LE BON COIN
Lun 11 Mar 2019 - 23:20 par kenneth

» Cumulus
Lun 11 Mar 2019 - 17:01 par Jede

Qui est en ligne ?
Il y a en tout 2 utilisateurs en ligne :: 0 Enregistré, 0 Invisible et 2 Invités

Aucun

Le record du nombre d'utilisateurs en ligne est de 29 le Mer 25 Fév 2015 - 14:01
Connexion

Récupérer mon mot de passe

Statistiques
Nous avons 176 membres enregistrés
L'utilisateur enregistré le plus récent est didier7854

Nos membres ont posté un total de 6923 messages dans 594 sujets
Portail ORIC




passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Poster un nouveau sujet   Répondre au sujet

Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par goyo le Ven 4 Jan 2019 - 10:13

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.

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);
ça non plus , il s'attend à un ')' à la place de la virgule
Code:
asm("lda #%b",val);


Dernière édition par goyo le Ven 4 Jan 2019 - 14:37, édité 2 fois
goyo
goyo

Messages : 141
Date d'inscription : 02/05/2014
Age : 47
Localisation : Massy

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par iss le Ven 4 Jan 2019 - 13:45

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.
iss
iss

Messages : 84
Date d'inscription : 30/10/2014

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par goyo le Ven 4 Jan 2019 - 14:39

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 Very Happy
goyo
goyo

Messages : 141
Date d'inscription : 02/05/2014
Age : 47
Localisation : Massy

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par goyo le Ven 4 Jan 2019 - 16:28

.. et comment tu fais pour passer une valeur d'adresse ....   Rolling Eyes

Code:
unsigned int val=0xbb80;

asm("pha;"
    "lda #$40;"
    "sta _val;"
    "pla;");
goyo
goyo

Messages : 141
Date d'inscription : 02/05/2014
Age : 47
Localisation : Massy

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par Dbug le Ven 4 Jan 2019 - 18:27

Bein dites donc, je ne savais même pas que le compilateur C supportait l'assembleur en ligne...
On en apprend tous les jours Smile

_________________

Dbug
Dbug

Messages : 141
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par iss le Ven 4 Jan 2019 - 20:51

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;");
}
This works for me. It's self modifying code but I don't have other better idea...
iss
iss

Messages : 84
Date d'inscription : 30/10/2014

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par drpsy le Ven 4 Jan 2019 - 23:59

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.
Very Happy
Les variables du code C sont visibles dans l'assembleur à condition d'ajouter un _ devant...

_________________
>++++++++++[<++++++++>-]<.>++++++[<++++>-]<+.----.+++++++++++++..-------------.[-]
drpsy
drpsy

Messages : 195
Date d'inscription : 20/07/2014
Age : 47
Localisation : Lagny sur Marne

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par goyo le Lun 7 Jan 2019 - 14:40

iss a écrit:
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;");
}
This works for me. It's self modifying code but I don't have other better idea...

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
goyo

Messages : 141
Date d'inscription : 02/05/2014
Age : 47
Localisation : Massy

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par Dbug le Lun 7 Jan 2019 - 18:25

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 Smile

_________________

Dbug
Dbug

Messages : 141
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par Dbug le Mer 9 Jan 2019 - 19:15

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");
      }
Suffit de regarder dans le code :p

_________________

Dbug
Dbug

Messages : 141
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par goyo le Jeu 10 Jan 2019 - 10:03

Dbug a écrit: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");
 }
Suffit de regarder dans le code :p

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);
}

résultat ! :
Code:
                                   CAPS
  ORIC EXTENDED BASIC V1.1              
  ` 1983 TANGERINE                                                             
                                        
   37631 BYTES FREE                    
                                        
  Ready                                
  CLOAD""                              
                                        
  j= BB41                              
                                        
  i= 0041                              
                                        
  Ready                
            
goyo
goyo

Messages : 141
Date d'inscription : 02/05/2014
Age : 47
Localisation : Massy

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par Dbug le Jeu 10 Jan 2019 - 13:06

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 Smile



_________________

Dbug
Dbug

Messages : 141
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par drpsy le Jeu 10 Jan 2019 - 14:07

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)

_________________
>++++++++++[<++++++++>-]<.>++++++[<++++>-]<+.----.+++++++++++++..-------------.[-]
drpsy
drpsy

Messages : 195
Date d'inscription : 20/07/2014
Age : 47
Localisation : Lagny sur Marne

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par goyo le Jeu 10 Jan 2019 - 15:03

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
goyo

Messages : 141
Date d'inscription : 02/05/2014
Age : 47
Localisation : Massy

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par drpsy le Jeu 10 Jan 2019 - 16:37

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é...

_________________
>++++++++++[<++++++++>-]<.>++++++[<++++>-]<+.----.+++++++++++++..-------------.[-]
drpsy
drpsy

Messages : 195
Date d'inscription : 20/07/2014
Age : 47
Localisation : Lagny sur Marne

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par goyo le Jeu 28 Fév 2019 - 13:00

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 Smile



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
goyo

Messages : 141
Date d'inscription : 02/05/2014
Age : 47
Localisation : Massy

Revenir en haut Aller en bas

Re: passage d'une variable du C à l'assembleur à l'aide de la fonction asm();

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous pouvez répondre aux sujets dans ce forum