2009-10-24 5 views
6

Quando si inserisce l'assemblatore inline in una funzione in linguaggio C, qual è la convenzione su quali registri si è autorizzati a utilizzare per zero? È responsabilità del compilatore salvare i valori di tutti i registri di cui ha bisogno prima di accedere al blocco asm? È responsabilità del programmatore memorizzare i valori in questi registri da qualche parte e ripristinarli prima di uscire dal blocco asm? Esiste una convenzione tipica o è molto specifica per l'implementazione?Assemblatore in linea: quali registri scratch possono essere utilizzati?

risposta

9

L'assemblaggio in linea è, per definizione, specifico del compilatore.

La maggior parte dei compilatori che supportano l'assemblaggio in linea presentano una sintassi che consente di indicare quali registri vengono modificati dall'assieme. Il compilatore può quindi salvare e ripristinare quei registri secondo necessità.

2

È possibile leggere l'utilizzo del registro in alcune convenzioni di chiamata here.

7

Questo è molto specifico del compilatore. Tuttavia, per un esempio realistico prendiamo gcc su x86. Il formato è:

asm (assembler template 
    : output operands    (optional) 
    : input operands    (optional) 
    : list of clobbered registers  (optional) 
    ); 

dove la "lista dei registri colpita" è la risposta a Che compilatore che registra il codice sta usando.

Ecco un semplice codice di copia della memoria:

asm ("movl $count, %%ecx; 
     up: lodsl;  
     stosl; 
     loop up;" 
    :   /* no output */ 
    :"S"(src), "D"(dst) /* input */ 
    :"%ecx", "%eax"); /* clobbered list */  

Alla luce di queste indicazioni, gcc non userà EAX ed ECX per altre cose nel blocco.

Ulteriori informazioni here.