C'est ce qui a fonctionné pour moi:
#![feature(asm)]
fn main() {
unsafe {
asm!("call ${0:c} + ${0:c}"
:
: "i"(8)
: "memory"
: "volatile"
)
}
}
Voici le documentation in the LLVM reference pertinent. En regardant la sortie de objdump
, nous pouvons vérifier que notre assemblée en ligne a été émis:
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
MISE À JOUR: Voici un exemple d'appeler directement une fonction de montage en ligne:
#![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.
)
}
}
Mais vous devriez ne jamais faire une telle chose, sauf si vous avez un argument très bon et convaincant pour le faire (par exemple, parce que vous écrivez un JIT). J'ai dû passer une heure à déboguer une mystérieuse erreur de segmentation jusqu'à ce que je réalise que je devais aussi mettre alignstack
dans la section des options.
Vous avez été averti.
Qu'essayez-vous exactement de faire? Ou êtes-vous en train d'expérimenter? – Alexandros