2009-11-04 13 views
6

Próbuję zrozumieć ten wbudowany kod zespołu, który pochodzi z _hypercall0here.Co oznacza% c w kodowaniu wbudowanego GCC?

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

Mam problem ze znalezieniem informacji o tym, co oznacza %c w pierwszym wierszu. Nie znalazłem żadnej informacji w najbardziej oczywistej sekcji GCC manual, która wyjaśnia %[name], ale nie pod numerem %c[name]. Czy jest jakieś inne miejsce, na które powinienem popatrzeć?

Odpowiedz

12

Z GCC internals documentation:

'% C cyfrowy' może być wykorzystywany do zastąpić argumentu operacji, która jest wartością stałą bez składni zwykle wskazuje argument bezpośredni.

2

Sprawdź montażowa (z gcc -S, czy może demontować plik obiektowy) i może być wyraźniejszy.

Domyślam się, że jest to stała. hypercall_page wygląda jak tabela instrukcji, z których każda wykonuje syscall. Może to wygeneruje call hypercall_page + {constant based on the expression given}, zasadniczo obliczając adres tego przesunięcia w czasie kompilacji.

Tak na marginesie, to __HYPERVISOR##name rzeczy naprawdę przypomina mi konwencji __NR_name_of_syscall typu można zobaczyć na syscalli w Linuksie za <asm/unistd.h> i podobnych miejscach.