Derniers sujets
» musique en c
Aujourd'hui à 15:23 par Ladywasky

» CEO-MAG 345 et VISU HIVERNALE
Aujourd'hui à 14:46 par laurentd75

» Moment musical....
Aujourd'hui à 7:34 par Ladywasky

» Comment mettre le son de l'oric atmos sur un TV ?
Hier à 13:33 par romu3

» The quest of the Holly Grail
Lun 14 Jan 2019 - 21:46 par didierv

» **NEW** EDGE for ORIC !!!!
Lun 14 Jan 2019 - 19:28 par Symoon

» Codage d'une carte déroulante en BASIC, C et Assembleur
Dim 13 Jan 2019 - 21:40 par laurentd75

» Combien de jeux d'aventure sur oric ?
Dim 13 Jan 2019 - 20:29 par romu3

» Nemausus: RPG du CEO
Dim 13 Jan 2019 - 8:01 par Voyageur

» Archives du site Oric Games
Ven 11 Jan 2019 - 23:01 par kenneth

» ~High Score Challenge ~
Ven 11 Jan 2019 - 20:46 par Dom50

» BASIC - Tirage au sort aléatoire - fonction RND()
Ven 11 Jan 2019 - 13:57 par maximus

» Tyrann I
Ven 11 Jan 2019 - 2:22 par Ladywasky

» passage d'une variable du C à l'assembleur à l'aide de la fonction asm();
Jeu 10 Jan 2019 - 16:37 par drpsy

» Projet Doctor WHO
Mer 9 Jan 2019 - 10:34 par goyo

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

Récupérer mon mot de passe

Statistiques
Nous avons 165 membres enregistrés
L'utilisateur enregistré le plus récent est retroric

Nos membres ont posté un total de 7891 messages dans 590 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
avatar
goyo

Messages : 119
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.
avatar
iss

Messages : 63
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
avatar
goyo

Messages : 119
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;");
avatar
goyo

Messages : 119
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

_________________

avatar
Dbug

Messages : 115
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...
avatar
iss

Messages : 63
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...

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

Messages : 168
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.
avatar
goyo

Messages : 119
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

_________________

avatar
Dbug

Messages : 115
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

_________________

avatar
Dbug

Messages : 115
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                
            
avatar
goyo

Messages : 119
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



_________________

avatar
Dbug

Messages : 115
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)

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

Messages : 168
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;");
avatar
goyo

Messages : 119
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é...

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

Messages : 168
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 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