2009-11-04 3 views
6

Ich versuche diesen Inline-Assembler-Code zu verstehen, der von _hypercall0here kommt.Was bedeutet% c in GCC Inline Assembly Code?

asm volatile ("call hypercall_page+%c[offset]" \ 
     : "=r" (__res) \ 
     : [offset] "i" (__HYPERVISOR_##name * sizeof(hypercall_page[0])) \ 
     : "memory", "edi", "esi", "edx", "ecx", "ebx", "eax") 

Ich habe Probleme beim Auffinden von Informationen auf, was %c in der ersten Zeile bedeutet. Ich habe keine Informationen im offensichtlichsten Abschnitt der GCC manual gefunden, die %[name] erklärt, aber nicht %c[name]. Gibt es noch einen anderen Ort, den ich mir ansehen sollte?

Antwort

12

Vom GCC internals documentation:

`% c digit" kann verwendet werden, um einen Operanden zu ersetzen, die ein konstanter Wert ohne die Syntax, die normalerweise einen unmittelbaren Operanden angibt.

2

Überprüfen Sie den Baugruppenausgang (mit gcc -S, oder vielleicht zerlegen Sie die Objektdatei) und es kann klarer sein.

Meine Vermutung ist, dass es für Konstante steht. hypercall_page sieht aus wie eine Tabelle mit Anweisungen, die jeweils einen Syscall machen. Vielleicht wird dies eine call hypercall_page + {constant based on the expression given} generieren, im Wesentlichen die Adresse dieses Offset zur Kompilierzeit berechnet haben.

Als Nebenwirkung dieses __HYPERVISOR##name Sachen erinnert mich wirklich an der __NR_name_of_syscall Typ Konvention Sie <asm/unistd.h> und ähnliche Orte für syscalls in Linux sehen.