2016-12-21 1 views
4

Der unten stehende Code wurde im April (Rust-Version ~ 1.6) gut gebaut, aber es nicht mehr.Ungültiger Operand für Inline-Asm-Constraint 'i' beim Schreiben von Inline-X86_64-Assembly

#![feature(asm)] 

enum MyEnum { One = 1 } 

fn main() { 
    unsafe { 
     asm!("nop" : : "i" (MyEnum::One as isize) : :); // broken 
    } 
} 

Die Fehlermeldung weist nicht auf offensichtliche Änderungen hin, die dies verursachen könnten.

+2

Zugehöriger Reddit-Thread: https://www.reddit.com/r/rust/comments/5jm4ww/translating_inline_assembler_expression_from_gcc/ –

+1

Sie werden wahrscheinlich arbeiten müssen, um einen [MCVE] bereitzustellen. Während ich Xen nicht habe, kann ich x86-Assembly kompilieren, das in Ihrer Nähe ist (http://play.integer32.com/?gist=35a5ab7e6dc00be69301632b88ef8851&version=nightly). – Shepmaster

+1

Ich habe getan, wie Sie gesagt haben, und es machte das Problem offensichtlich. Danke für die Hilfe. –

Antwort

4

Der Wert für die "i"-Einschränkung muss eine Kompilierzeitkonstante sein, und Sie liefern etwas, was nicht der Fall ist. Wenn Sie die Addition in Rust verschieben, können Sie sowohl ein Register als auch eine Konstante mit den Einschränkungen "ri" verwenden.

Ob etwas eine Konstante für den Inline-Assembler ist, kann durch Optimierungsmöglichkeiten beeinflusst werden.

+1

Das ist es. Es stellte sich heraus, dass 'MyEnum :: MyEnumCase as isize' einmal als Kompilierzeitkonstante galt, aber nicht mehr. Minimal Repro: https://gist.github.com/lilred/3868c48004ce344d87002f540d5b21f3 –

+0

Ich habe meine Frage bearbeitet, um das tatsächliche Problem besser zu reflektieren. –

Verwandte Themen