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?

È stato utile?

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 e simili luoghi di Linux.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top