2009-04-08 6 views
8

J'essaie de porter un code d'assemblage écrit dans Visual Studio dans l'assemblage en ligne GNU sous Linux. Le code d'origine utilise _emit que MSDN décrit comme une pseudo instruction et explique comme suit:Quel est l'équivalent de _emit sur Linux?

La pseudo-instruction _emit est similaire à la directive DB de MASM. Vous utilisez _emit pour définir un seul octet immédiat à l'emplacement actuel dans le segment de texte en cours. Toutefois, _emit ne peut définir qu'un seul octet à la fois et il ne peut définir que des octets dans le segment de texte. Il utilise la même syntaxe que l'instruction INT.

Comment puis-je faire la même chose sous Linux?

Répondre

15

à émettre octets 0x12 (par exemple), faites:

asm __volatile__ (".byte 0x12"); 

Bien que, vous pourriez obtenir des résultats surprenants avec des optimisations activées.

+0

+1, bon point sur les optimisations. –

+0

Merci! Cela a bien fonctionné. – samgrover

+0

Avec '__volatile__' (ou simplement' volatile' sur les compilateurs modernes) vous ne devriez avoir aucun problème même avec les optimisations activées. Le compilateur doit émettre l'octet à l'emplacement indiqué (bien sûr, le code environnant peut être fortement optimisé ...). – BeeOnRope