2009-11-04 19 views
6

Estoy tratando de entender este código de ensamblaje en línea que viene de _hypercall0here.¿Qué significa% c en el código de ensamblado en línea de 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") 

Estoy teniendo problemas para encontrar información sobre lo que %c en la primera línea significa. No encontré ninguna información en la sección más obvia del GCC manual, que explica %[name], pero no %c[name]. ¿Hay algún otro lugar donde debería mirar?

Respuesta

12

Desde el GCC internals documentation:

`% c dígitos 'se puede utilizar para sustituir un operando que es un valor constante sin la sintaxis que normalmente indica un operando inmediato.

2

Compruebe la salida del conjunto (con gcc -S, o tal vez desmonte el archivo del objeto) y puede ser más claro.

Supongo que significa constante. hypercall_page parece una tabla de instrucciones que cada uno hace un syscall. Tal vez esto generará un call hypercall_page + {constant based on the expression given}, básicamente habiendo calculado la dirección de este desplazamiento en tiempo de compilación.

Dicho sea de paso, este __HYPERVISOR##name cosas realmente me recuerda a la convención __NR_name_of_syscall tipo de letra para llamadas al sistema en <asm/unistd.h> y similares lugares de Linux.

Cuestiones relacionadas