Forum Oric
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Derniers sujets
» besoin cable coleur et interface de lecture sd card
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptySam 18 Juil 2020 - 16:29 par kenneth

» le forum fourre tout
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyMar 30 Juin 2020 - 13:11 par Admin

» I had a dream .. glOric
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptySam 6 Juin 2020 - 14:18 par jbperin

» Multi soluces...
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyMar 19 Mai 2020 - 12:41 par soft-bug

» Des nouvelles de BAS_ORIC
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyMer 6 Mai 2020 - 16:08 par goyo

» 3D walkthrough template en moins de 600 lignes de C
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyMer 29 Avr 2020 - 20:43 par Star42

» CB2 micro
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptySam 11 Avr 2020 - 19:29 par jbperin

» Le bonjour de codeur
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyMer 1 Avr 2020 - 15:18 par Invité

» [résolu] Format des fichiers Hyperbasic...
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptySam 28 Mar 2020 - 19:50 par damien

» [résolu] Récupération contenu disquettes 3 pouces...
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyVen 27 Mar 2020 - 15:06 par damien

» Echange de jeux/logiciels
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyLun 23 Mar 2020 - 20:15 par Star42

» Ordi Portable Sony VAIO
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyDim 22 Mar 2020 - 16:17 par froggy

» une atan2 pour vos lib math
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyDim 22 Mar 2020 - 11:30 par drpsy

» nouveau site
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyJeu 19 Mar 2020 - 20:02 par Star42

» CEO Mag Spéciaux disponibles
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyJeu 19 Mar 2020 - 9:33 par musepat

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 208 membres enregistrés
L'utilisateur enregistré le plus récent est darq

Nos membres ont posté un total de 8575 messages dans 746 sujets
Portail ORIC



Le Deal du moment : -50%
-50% sur Nike Air Max 200 Winter
Voir le deal
63 €
Le deal à ne pas rater :
ASOS : Livraison Premier à 8 €/an
8 €
Voir le deal

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

Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 188
Date d'inscription : 02/05/2014
Age : 48
Localisation : Massy

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 112
Date d'inscription : 30/10/2014

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 188
Date d'inscription : 02/05/2014
Age : 48
Localisation : Massy

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 188
Date d'inscription : 02/05/2014
Age : 48
Localisation : Massy

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 248
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 112
Date d'inscription : 30/10/2014

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 206
Date d'inscription : 20/07/2014
Age : 48
Localisation : Lagny sur Marne

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 188
Date d'inscription : 02/05/2014
Age : 48
Localisation : Massy

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 248
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 248
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 188
Date d'inscription : 02/05/2014
Age : 48
Localisation : Massy

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 248
Date d'inscription : 06/01/2013

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 206
Date d'inscription : 20/07/2014
Age : 48
Localisation : Lagny sur Marne

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 188
Date d'inscription : 02/05/2014
Age : 48
Localisation : Massy

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 206
Date d'inscription : 20/07/2014
Age : 48
Localisation : Lagny sur Marne

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 : 188
Date d'inscription : 02/05/2014
Age : 48
Localisation : Massy

Revenir en haut Aller en bas

passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); Empty 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 ne pouvez pas répondre aux sujets dans ce forum