2016-12-21 9 views
4

아래 코드는 4 월에 Rust 버전 1.6을 다시 빌드하는 데 사용되었지만 더 이상 필요하지 않습니다.인라인 asm 제약 조건에 대한 피연산자가 잘못되었습니다. 인라인 x86_64 어셈블리를 작성할 때 'i'가 발생했습니다.

#![feature(asm)] 

enum MyEnum { One = 1 } 

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

오류 메시지가 원인 일 수있는 분명한 변경을 가리 키지 않습니다.

+2

관련된 reddit 스레드 : https://www.reddit.com/r/rust/comments/5jm4ww/translating_inline_assembler_expression_from_gcc/ –

+1

[MCVE]를 제공하기 위해 노력해야 할 가능성이 높습니다. 내가 Xen을 가지고 있지는 않지만 [나는 당신에게 가까운 x86 어셈블리를 컴파일 할 수있다] (http://play.integer32.com/?gist=35a5ab7e6dc00be69301632b88ef8851&version=nightly). – Shepmaster

+1

나는 당신이 말했듯이 그 일을 분명히했습니다. 도와 주셔서 감사합니다. –

답변

4

"i" 제약 조건의 값은 컴파일 타임 상수 여야하며 그렇지 않은 값을 제공해야합니다. 추가를 Rust로 이동하면 "ri" 제약 조건을 사용하여 상수뿐만 아니라 레지스터를 사용할 수 있습니다.

인라인 어셈블러를 위해 상수가 있는지 여부는 최적화 옵션의 영향을받을 수 있습니다.

+1

이것은 그 것이다. "MyEnum :: MyEnumCase as isize"는 한때 컴파일 타임 상수로 간주되었지만 더 이상은 아니라고 밝혀졌습니다. 최소 재현 : https://gist.github.com/lilred/3868c48004ce344d87002f540d5b21f3 –

+0

실제 문제를보다 잘 반영하기 위해 제 질문을 수정했습니다. –