Это то, что работает для меня:
#![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
в разделе опций.
Вы были предупреждены.
Что именно вы пытаетесь сделать? Или вы просто экспериментируете? – Alexandros