¿Qué significa% de C en GCC código ensamblador en línea?
-
16-09-2019 - |
Pregunta
Estoy tratando de entender el código ensamblador en línea que viene de _hypercall0
aquí
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 de los medios. No he encontrado ninguna información en la sección más evidente de la GCC manual de , lo que explica %[name]
, pero no %c[name]
. ¿Hay algún otro lugar en el que debería mirar?
Solución
Desde el GCC documentación internos :
`% c dígitos ' se puede utilizar para sustituir una operando que es un valor constante sin la sintaxis que normalmente indica un operando inmediato.
Otros consejos
Compruebe la salida de montaje (con gcc -S
, o tal vez de desmontar el archivo de objeto) y puede ser más claro.
Mi conjetura es que es sinónimo de constante . hypercall_page
se parece a una tabla de instrucciones que cada uno haga una llamada al sistema. Tal vez esto va a generar un call hypercall_page + {constant based on the expression given}
, esencialmente haber calculado la dirección de este desplazamiento en tiempo de compilación.
Como acotación al margen, esto __HYPERVISOR##name
realmente me recuerda a la convención tipo __NR_name_of_syscall
ve para llamadas al sistema en lugares de Linux