Voir la "prolongation de l'Asm" à la page du CCG de la documentation.
Vous pouvez empêcher un asm
instructions de suppression en écrivant le mot-clé volatile
après l' asm
. [...] L' volatile
mot-clé indique que l'instruction a d'importants effets secondaires. GCC ne supprimera pas un volatile
asm si elle est accessible.
et
Un asm
instruction, sans aucune sortie opérandes soient traités de façon identique à un volatile asm
enseignement.
Aucun de vos exemples ont opérandes de sortie spécifié, alors l' asm
et asm volatile
formes se comportent de façon identique: ils créent un point dans le code qui ne peut pas être supprimé (sauf s'il est prouvé à être inaccessible).
Ce n'est pas tout à fait la même chose que de ne rien faire. Voir cette question pour un exemple d'un mannequin asm
qui change de génération de code - dans cet exemple, le code qui fait le tour d'une boucle de 1000 fois devient vectorisées dans le code qui calcule 16 itérations de la boucle à la fois; mais la présence d'un asm
à l'intérieur de la boucle inhibe l'optimisation (l' asm
doit être atteint 1000 fois).
L' "memory"
tabasser fait GCC supposer que la mémoire peut être arbitrairement lus ou écrits par l' asm
bloc, va empêcher le compilateur de la réorganisation des charges ou des magasins à travers elle:
Ce sera la cause de GCC pour ne pas garder en mémoire les valeurs mises en cache dans les registres à travers l'instruction assembleur et de ne pas optimiser les magasins ou les charges pour que la mémoire.
(Cela n'empêche pas qu'un CPU, de la réorganisation des charges et de magasins à l'égard d'un autre CPU, si vous avez besoin d'une réelle barrière de mémoire d'instructions pour cela.)