Cosa c% significa in GCC codice assembly inline?
-
16-09-2019 - |
Domanda
Sto cercando di capire questo codice assembly inline che viene da _hypercall0
qui
asm volatile ("call hypercall_page+%c[offset]" \
: "=r" (__res) \
: [offset] "i" (__HYPERVISOR_##name * sizeof(hypercall_page[0])) \
: "memory", "edi", "esi", "edx", "ecx", "ebx", "eax")
Sto avendo difficoltà a trovare le informazioni su ciò che %c
nella prima riga significa. Non ho trovato alcuna informazione nella sezione più evidente della GCC manuale , che spiega %[name]
, ma non %c[name]
. C'è qualche altro posto che dovrei guardare?
Soluzione
GCC documentazione internals :
`% c cifre ' può essere utilizzato per sostituire un operando che è un valore costante senza la sintassi che normalmente indica un operando immediato.
Altri suggerimenti
Controlla l'uscita di montaggio (con gcc -S
, o forse smontare il file oggetto) e può essere più chiaro.
La mia ipotesi è che si sta per costante . hypercall_page
si presenta come una tabella di istruzioni che ogni facciamo una chiamata di sistema. Forse questo genererà un call hypercall_page + {constant based on the expression given}
, in sostanza, dopo aver calcolato l'indirizzo di questo compensato al momento della compilazione.
Per inciso, questa roba __HYPERVISOR##name
davvero mi ricorda tipo __NR_name_of_syscall
convenzione vede per chiamate di sistema in