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?

¿Fue útil?

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 unistd.h y similares.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top