2009-10-24 7 views
6

Wenn Sie Inline-Assembler in einer C-ähnlichen Sprache in eine Funktion einfügen, wie lautet die Konvention darüber, welche Register Sie für Scratch verwenden dürfen? Ist der Compiler dafür verantwortlich, die Werte aller Register zu speichern, die er vor dem Eingeben des Blocks asm speichern muss? Liegt es in der Verantwortung des Programmierers, die Werte in diesen Registern irgendwo zu speichern und sie vor dem Verlassen des Blocks asm wiederherzustellen? Gibt es eine typische Konvention oder ist das sehr umsetzungsspezifisch?Inline Assembler: Welche Scratch-Register können verwendet werden?

Antwort

9

Inline-Assembly ist per Definition compilerspezifisch.

Die meisten Compiler, die Inline-Assemblierung unterstützen, verfügen über eine Syntax, mit der Sie angeben können, welche Register von der Assembly geändert werden. Der Compiler kann diese Register dann nach Bedarf speichern und wiederherstellen.

2

Sie können bei einigen Aufrufkonventionen here auf Register-Verwendung lesen.

7

Dies ist sehr Compiler-spezifisch. Für ein realistisches Beispiel nehmen wir gcc auf x86. Das Format ist:

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

Wo die „Liste der clobbered Register“ wird Sie den Compiler zu sagen, die Ihr Code registriert verwendet.

Hier ist eine einfache Speicherkopie Code:

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

diese Richtungen gegeben, gcc nicht EAX und ECX für andere Dinge im Block werden.

Weitere Informationen here.