prob tout con (je pense) d'asm en ligne en C

prob tout con (je pense) d'asm en ligne en C - ASM - Programmation

Marsh Posté le 05-05-2004 à 21:13:57    

Salut, je suis nouveau sur le forum
 
Je programme en C et depuis pas si longtemps j'ai eu envie d'ajouter de l'assembleur dans mes sources pour répondre à des besoins spécifiques. J'ai donc commencé à me documenter sur l'assembleur en ligne et uniquement  ce dont j'avais besoin.
 
Une des choses dont j'ai eu besoin c'est de récupérer une valeur a partir du registre ax et de le mettre dans une de mes variables déclarée dans la partie C du programme. Et là open watcom m'a tout simplement répondu :non: (enfin ca compile mais la ligne est ignorée donc la variable inutilisée)
 
Voila le bout de code :

Code :
  1. int statut;
  2.   _asm
  3.   {
  4.     mov statut, ax
  5.   }
  6.   return statut;


 
J'espère donc que quelqu'un sera en mesure de me répondre
 
Dri :hello:
 
PS. j'ai essayé pas mal de trucs, mais j'ai mis en gros ce que je voudrais que ca fasse (statut = ax)

Reply

Marsh Posté le 05-05-2004 à 21:13:57   

Reply

Marsh Posté le 05-05-2004 à 21:28:31    

essaie avec ça: __asm (2 underscores au lieu d'un seul).


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 06-05-2004 à 23:19:38    

non _asm ça marche aussi
c'est un pb de taille :
int c'est 4 octets, ax ça en fait deux
 
essaye :
 
unsigned short statut;  
    _asm  
    {  
        mov statut, ax  
    }  
    return (int)statut;


Message édité par jesus_christ le 10-05-2004 à 22:16:51
Reply

Marsh Posté le 07-05-2004 à 04:53:12    

mov statut,eax

Reply

Marsh Posté le 07-05-2004 à 04:54:58    

sinon regarde le genre de synthaxe que tu peux avoir avec le watcom:
 
char *VLine(void *tgt, long cl, long y, long ax);
#pragma aux VLine =          \
"Lp: mov DWORD PTR[edi],eax" \
    "add edi,ebx"            \
    "dec ecx"                \
    "jnz Lp"                 \
parm [edi][eax][ecx][ebx] modify [edi ecx] value [edi];


Message édité par bjone le 07-05-2004 à 04:57:07
Reply

Marsh Posté le 07-05-2004 à 09:27:57    

bjone a écrit :

mov statut,eax


oooops :whistle:


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 10-05-2004 à 14:30:19    

J'avai essayé char int et long, mais short je l'utilise tellement pas souvent que... Bah merci beaucoup c'était exactement ca le problème.
 
Dri :D

Reply

Marsh Posté le 13-05-2004 à 11:45:11    

long et int ont souvent la même capacité... 32 bits.
Souvent, mais pas toujours.

Reply

Marsh Posté le 13-05-2004 à 16:22:35    

bin ça dépends, si en l'occurence, tu compiles pour une cible 16bits (mode réel), ou 32bits (mode protégé).
 
il a pas précisé quel était le système ciblé (dos, dos+dos4gw/pmodew,win32....)
 
mais vu que le mov status,ax échoue, c'est qu'il est soit en dos+dos4gw/pmodew soit en win32.

Reply

Marsh Posté le 13-05-2004 à 21:10:20    

christophe_d13 a écrit :

long et int ont souvent la même capacité... 32 bits.
Souvent, mais pas toujours.

la régle C c'est, pour la taille ;
 
char <= short <= int <= long
 
sachant que sur certains systèmes "exotiques" avancés (donc ni PC ni Mac) ils peuvent tous êtres égaux à 8 (64-bits) !
 
même (sizeof(char) == 1) n'est pas toujours vrai en C (mais toujours vrai sur PC)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed