Dans mon cours d'expérimentation avec GCC assembly en ligne, j'ai rencontré un nouveau problème qui concerne les labels et inline code.
Considérez les points suivants saut simple:
__asm__
(
"jmp out;"
"out:;"
:
:
);
Ce n'est rien, à l'exception de sauter à l' out
label. En l'état, ce code compile bien. Mais si vous le placez à l'intérieur d'une fonction, puis compiler avec les options d'optimisation, le compilateur se plaint: "Erreur: le symbole" out "est déjà défini".
Ce qui semble se passer, c'est que le compilateur est la répétition de cette assemblée de code à chaque fois qu'il inlines la fonction. Ceci provoque l'étiquette out
pour obtenir dupliqué, conduisant à de multiples out
labels.
Alors, comment puis-je contourner cela? Est-il vraiment pas possible d'utiliser des étiquettes dans un assembly en ligne? Ce tutoriel sur GCC inline assemblée mentionne que:
Ainsi, vous pouvez faire votre assemblée en RPC, les macros, et dans la ligne C fonctions, donc n'importe qui peut l'utiliser en tant que toute fonction C/macro. Les fonctions Inline ressemblent à des macros très bien, mais sont parfois nettoyant à utiliser. Méfiez-vous que dans tous ces cas, le code sera dupliqué, de sorte que seules les labels locaux(de 1: style) doivent être définies dans l' asm code.
J'ai essayé de trouver plus d'informations à propos de ces "local les étiquettes", mais n'arrive pas à trouver quoi que ce soit concernant assembly en ligne. Il ressemble à ce tutoriel est de dire qu'un label local est un nombre suivi d'une virgule (comme 1:
), alors j'ai essayé à l'aide d'une étiquette comme ça. Fait intéressant, le code compilé, mais au moment de l'exécution il simplement déclenché une erreur de Segmentation. Hmm...
Donc, des suggestions, des conseils, des réponses...?