[SOS] asm volatile
   
    Daniel Lezcano
     
    daniel.lezcano at free.fr
       
    Ven 21 Oct  21:28:08 CEST 2005
    
    
  
>>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