Forum Oric
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Derniers sujets
» Bla Bla général du Jury
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyJeu 21 Mar 2024 - 8:51 par Dom50

» carte mère Oric (re)tracée
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyMar 5 Mar 2024 - 18:54 par kenneth

» Meurtre à Grande Vitesse
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyDim 25 Fév 2024 - 5:09 par Iurius

» ORIC-1 sur LE BON COIN
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyVen 23 Fév 2024 - 23:01 par Mcar

» ORIC ATMOS sur LE BON COIN
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyDim 4 Fév 2024 - 12:06 par kiwilevrai

» Problème d'affichage des couleurs avec un Oric Atmos
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptySam 27 Jan 2024 - 1:26 par pierbail

» Bienvenue dans le Forum des Oriciens
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyMar 9 Jan 2024 - 12:33 par Dom50

» Rencontre avec Laurant Weill, co-fondateur de Loriciel, et mon garçon de 12 ans
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyVen 29 Déc 2023 - 14:13 par Arcade-des-Monts

» Bonnes fêtes
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyMar 26 Déc 2023 - 10:21 par Dom50

» Murders in Venice / Meutres à Venise
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptySam 18 Nov 2023 - 22:44 par retroric

» Un clavier PS/2 pour tester un ORIC
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyDim 27 Aoû 2023 - 9:49 par Voyageur

» Disquette 3" Sedoric
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyMar 1 Aoû 2023 - 14:22 par AtomeX

» faire un 6502 avec des phototransistor
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyDim 16 Juil 2023 - 17:26 par Voyageur

» Oricutron linux et DSK
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyJeu 29 Juin 2023 - 18:34 par Voyageur

» No Problem !
passage d'une variable du C à l'assembleur à l'aide de la fonction asm(); EmptyDim 25 Juin 2023 - 17:53 par Voyageur

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

Nos membres ont posté un total de 8921 messages dans 811 sujets
Sites Sympas

> Culture Club


Le Deal du moment : -24%
PC Portable Gaming 15.6″ Medion Erazer Deputy ...
Voir le deal
759.99 €
anipassion.com

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

4 participants

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 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 : 199
Date d'inscription : 02/05/2014
Age : 52
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 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 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 : 199
Date d'inscription : 02/05/2014
Age : 52
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 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 : 199
Date d'inscription : 02/05/2014
Age : 52
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 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 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 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 : 208
Date d'inscription : 20/07/2014
Age : 52
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 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 : 199
Date d'inscription : 02/05/2014
Age : 52
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 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 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 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 : 199
Date d'inscription : 02/05/2014
Age : 52
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 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 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 : 208
Date d'inscription : 20/07/2014
Age : 52
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 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 : 199
Date d'inscription : 02/05/2014
Age : 52
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 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 : 208
Date d'inscription : 20/07/2014
Age : 52
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 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 : 199
Date d'inscription : 02/05/2014
Age : 52
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