2013-04-14 8 views
7

Ich schreibe eine sehr leichte libc - Ersatzbibliothek, damit ich die Kernel - Anwendungsschnittstelle besser verstehen kann. Die erste Aufgabe besteht eindeutig darin, einige Systemaufruf-Wrapper einzurichten. Ich habe erfolgreich 1 bis 3 Argument Wrapper arbeiten, aber ich habe mit einem 4-Argument-Variante zu kämpfen. Hier ist mein Ausgangspunkt:Einschränkung von r10 register in gcc inline x86_64 assembly

long _syscall4(long type, long a1, long a2, long a3, long a4) 
{ 
    long ret; 
    asm 
    (
     "syscall" 
     : "=a"(ret) 
     : "a"(type), "D"(a1), "S"(a2), "d"(a3), "r10"(a4) 
     : "c", "r11" 
    ); 
    return ret; 
} 

Der Compiler gibt mir die folgende Fehlermeldung:

error: matching constraint references invalid operand number 

Meine _syscall3 Funktion funktioniert gut, aber doesnt Verwendung r10 oder eine clobber Liste haben.

Irgendwelche Gedanken?

Antwort

0

Vermutlich, weil keine Anweisungen spezifische Anforderungen für r10 Register haben, die gcc-Leute haben keine Einschränkung für sie erstellt (da die Einschränkungen in erster Linie für die Maschinenbeschreibungen sind). Wenn Sie auf Inline-Asm bestehen, glaube ich nicht, dass Sie es besser machen können, als eine allgemeine "r" (oder "m") Einschränkung zu verwenden und sich selbst in r10 zu verschieben (und es der Clobber-Liste hinzuzufügen).

5

Es gibt keine Einschränkungen für Register: %r8 .. %15. neuere sollte (wie in gcc-4.x) akzeptieren jedoch:

register long r10 asm("r10") = a4; 

dann die Eingangsbeschränkung verwenden: "r" (r10)

Diese die __asm__ erfordern mit __volatile__ qualifiziert werden - ich renne weg Speicher hier, so kann ich Ihnen nicht sagen, wenn diese Syntax offiziell gemacht wurde, etc. Es ist eine sinnvolle Wiederverwertung des ansonsten nutzlosen Schlüsselwortes register.

+2

Toller Tipp. Dies ist ein fantastisches Feature, das GCC Inline Assembler wirklich einzigartig macht. Hier ist die relevante Dokumentation: https://gcc.gnu.org/onlinedocs/gcc/Local-Reg-Vars.html – linguamachina