2015-12-27 7 views
2

Я следующий код в test.s:Rust встроенный ассемблер шаблон синтаксис

call $8 + $8 

Запуск nasm test.s успешно компилируется. Я бы ожидал, что следующий эквивалентный код Rust для компиляции успешно, но это не так.

В test.rs:

#![feature(asm)] 
fn main() { 
    unsafe { 
     asm! (
      "call $0 + $0" 
      : 
      : "i" (8) 
      : "memory" 
      : "volatile" 
     ) 
    } 
} 

Выход rustc test.rs:

test.rs:4:9: 10:11 error: <inline asm>:1:12: error: invalid token in expression 
     call $8 + $8 
       ^
+0

Что именно вы пытаетесь сделать? Или вы просто экспериментируете? – Alexandros

ответ

6

Это то, что работает для меня:

#![feature(asm)] 
fn main() { 
    unsafe { 
     asm!("call ${0:c} + ${0:c}" 
      : 
      : "i"(8) 
      : "memory" 
      : "volatile" 
     ) 
    } 
} 

Вот соответствующий documentation in the LLVM reference. Глядя на выходе objdump, мы можем убедиться, что наша рядная сборка вылетать:

0000000000005190 <_ZN4main20hc3048743ecd04f53eaaE>: 
    5190: e8 7b ae ff ff   callq 10 <_ZN10sys_common11thread_info11THREAD_INFO5__KEY20h20efb688859d2c0dRhsE+0x10> 
    5195: c3      retq 
    5196: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 
    519d: 00 00 00 

UPDATE: Вот пример непосредственного вызова функции от встроенного ассемблера:

#![feature(asm)] 

fn called_even_if_mangled() { 
    println!("Just a regular function minding its own business"); 
} 

fn main() { 
    unsafe { 
     asm!("call ${0:c}" 
      : 
      : "i"(called_even_if_mangled) 
      : "memory" 
      : "volatile", "alignstack" 
      // Omit "alignstack" and you'll get a segfault because of a 
      // misaligned SSE load on some initialization code regarding 
      // stdin. 
     ) 
    } 
} 

Но вы должны никогда не делайте такую ​​вещь, если у вас нет очень хорошего и убедительного аргумента для этого (например, потому, что вы пишете JIT). Мне пришлось потратить час, отлаживая загадочный segfault, пока я не понял, что мне также пришлось поставить alignstack в разделе опций.

Вы были предупреждены.

+0

Спасибо! Любая идея, если можно использовать это с символическими именами для входов/выходов? Я не могу найти никакой информации по этой теме, но [LLVM, похоже, ее поддерживает] (http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/asm.c?view=markup) –

+1

Я обновил ответ на примере. – Alexandros

Смежные вопросы