2009-10-24 8 views
6

Lorsque vous insérez un assembleur en ligne dans une fonction dans un langage C, quelle est la convention sur les registres que vous êtes autorisé à utiliser pour scratch? Est-ce la responsabilité du compilateur de sauvegarder les valeurs de tous les registres qu'il doit sauvegarder avant d'entrer dans le bloc asm? Est-ce la responsabilité du programmeur de stocker les valeurs dans ces registres quelque part et de les restaurer avant de quitter le bloc asm? Y a-t-il une convention typique ou est-ce très spécifique à la mise en œuvre?Assembleur en ligne: Quels registres de travail peuvent être utilisés?

Répondre

9

L'assemblage en ligne est, par définition, spécifique au compilateur.

La plupart des compilateurs prenant en charge l'assemblage en ligne ont une syntaxe qui vous permet d'indiquer quels registres sont modifiés par l'assemblage. Le compilateur peut alors enregistrer et restaurer ces registres si nécessaire.

2

Vous pouvez lire sur l'utilisation du registre dans certaines conventions d'appel here.

7

Ceci est très spécifique au compilateur. Cependant, pour un exemple réaliste, prenons gcc sur x86. Le format est le suivant:

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

Lorsque la « liste des registres mis à mal », vous dit la compilateur qui enregistre votre code utilise.

est ici un simple code de copie de mémoire:

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

Compte tenu de ces directions, gcc n'utilisera EAX et ECX pour d'autres choses dans le bloc.

Plus d'infos here.

Questions connexes