2016-12-21 7 views
4

Код, используемый для создания просто отлично в апреле (версия Rust ~ 1.6), но он больше не работает.Недопустимый операнд для встроенного ограничения asm «i» при записи встроенной сборки x86_64

#![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

Я отредактировал свой вопрос, чтобы лучше отразить фактическую проблему. –