2016-12-21 1 views
4

Le code ci-dessous a été construit en avril (version Rust ~ 1.6), mais ce n'est plus le cas. Le message d'erreur ne pointe pas vers des changements évidents qui pourraient être à l'origine de ce problème.Opérande invalide pour la contrainte inline 'i' lors de l'écriture de l'assemblage x86_64 inline

+2

Fil de reddit associé: https://www.reddit.com/r/rust/comments/5jm4ww/translating_inline_assembler_expression_from_gcc/ –

+1

Vous aurez probablement besoin de travailler pour fournir un [MCVE]. Bien que je n'ai pas Xen, [je peux compiler x86 assemblage qui est proche de la vôtre] (http://play.integer32.com/?gist=35a5ab7e6dc00be69301632b88ef8851&version=nightly) très bien. – Shepmaster

+1

J'ai fait comme vous l'avez dit, et cela a rendu le problème évident. Merci pour l'aide. –

Répondre

4

La valeur de la contrainte "i" doit être une constante de compilation et vous lui fournissez quelque chose qui ne l'est pas. Si vous déplacez l'addition dans Rust, vous pouvez utiliser un registre ainsi qu'une constante en utilisant les contraintes "ri".

Si quelque chose est une constante dans le but de l'assembleur en ligne peut être affectée par les options d'optimisation.

+1

C'est ça. Il s'avère que 'MyEnum :: MyEnumCase as isize' était autrefois considéré comme une constante à la compilation, mais ce n'est plus le cas. Repro minimal: https://gist.github.com/lilred/3868c48004ce344d87002f540d5b21f3 –

+0

J'ai modifié ma question pour mieux refléter le problème actuel. –