[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