[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