[SOS] asm volatile

romain romain at hexanium.com
Sam 22 Oct 12:12:59 CEST 2005


Salut, 

Merci pour cet info Daniel, c'est un peu plus évident désormais.

C'est le terme qui est bizard, "Volatille" disont qu'il devrai etre
"volatille" quand il peut etre enlevé et normal quand il ne bougera pas
!
Mais bon j'ai pigé.

Un grand Merci.

Romain

> -----Message d'origine-----
> De : sos-bounces at the-doors.enix.org 
> [mailto:sos-bounces at the-doors.enix.org] De la part de Daniel Lezcano
> Envoyé : vendredi 21 octobre 2005 21:28
> À : SOS mailing-list
> Objet : [SOS] asm volatile
> 
> 
> 
> >>Question 4:
> >>-----------
> >>Question de base désolé, c'est quoi cette notion de 
> "volatile" ? Quel 
> >>difference entre un "asm" et un "asm volatile" ?
> >>    
> >>
> >
> >Bonne question, si quelqu'un à la réponse
> >  
> >
> Cette instruction indique à gcc de ne pas supprimer 
> l'instruction lors 
> de la compilation et la laisser telle quel dans le code 
> assembleur. Prenons l'exemple de ce programme:
> 
> #include <stdio.h>
> 
> int main(int argc, char* argv[])
> {
>         int toto = 0;
>         asm ("mov %%eax,%0":"=g" (toto));
>         return 0;
> }
> 
> Si tu la compiles: gcc -c -g -O2 -Wall toto.c
> Et que tu desassembles l'objet: objdump -D toto.o
> 
> Disassembly of section .text:
> 
> 00000000 <main>:
>    0:   55                      push   %ebp
>    1:   89 e5                   mov    %esp,%ebp
>    3:   83 ec 08                sub    $0x8,%esp
>    6:   83 e4 f0                and    $0xfffffff0,%esp
>    9:   83 ec 10                sub    $0x10,%esp
>    c:   31 c0                   xor    %eax,%eax
>    e:   c9                      leave
>    f:   c3                      ret
> 
> Ton instruction mov eax,0x0 n'est pas là. Gcc a déterminé que c'était 
> inutile parce-que la
> variable toto n'est jamais utilisée.
> 
> Maintenant tu rajoutes asm volatile à la place de volatile et 
> tu obtiens:
> 
> Disassembly of section .text:
> 
> 00000000 <main>:
>    0:   55                      push   %ebp
>    1:   89 e5                   mov    %esp,%ebp
>    3:   83 ec 08                sub    $0x8,%esp
>    6:   83 e4 f0                and    $0xfffffff0,%esp
>    9:   83 ec 10                sub    $0x10,%esp
>    c:   89 c0                   mov    %eax,%eax <=== y'a encore une 
> optimisation, mais l'instruction est là.
>    e:   31 c0                   xor    %eax,%eax
>   10:   c9                      leave
>   11:   c3                      ret
> 
> Voilà.
> 
> 
> 
> 




Plus d'informations sur la liste de diffusion Sos