2015-12-27 2 views
2

Je le code suivant dans test.s:Rust modèle assembleur en ligne syntaxe

call $8 + $8 

Exécution nasm test.s compile avec succès. Je m'attendrais à ce que le code Rust équivalent suivant soit compilé avec succès, mais ce n'est pas le cas.

En test.rs:

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

Sortie de rustc test.rs:

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

Qu'essayez-vous exactement de faire? Ou êtes-vous en train d'expérimenter? – Alexandros

Répondre

6

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.

+0

Merci! Toute idée s'il est possible d'utiliser ceci avec des noms symboliques pour les entrées/sorties? Je ne trouve aucune information sur le sujet, mais [LLVM semble le soutenir] (http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/asm.c?view=markup) –

+1

J'ai mis à jour la réponse avec un exemple. – Alexandros