¿Qué asegura que las lecturas / escrituras de operandos ocurran en el tiempo deseado con ASM extendido?

De acuerdo con los CCGASM extendido y plantilla de ensamblador, para mantener las instrucciones consecutivas, deben estar en el mismo bloque ASM. Tengo problemas para comprender qué proporciona la programación o los tiempos de las lecturas y escrituras a los operandos en un bloque con múltiples declaraciones.

Como ejemplo,EBX oRBX necesita ser preservado cuando se usaCPUID porque, según el ABI, la persona que llama lo posee. Hay algunas preguntas abiertas con respecto al uso deEBX yRBX, por lo que queremos preservarlo incondicionalmente (es un requisito). Por lo tanto, se deben codificar tres instrucciones en un solo bloque ASM para garantizar la consecutividad de las instrucciones (en relación con la plantilla del ensamblador que se analiza en el primer párrafo):

unsigned int __FUNC = 1, __SUBFUNC = 0;
unsigned int __EAX, __EBX, __ECX, __EDX;

__asm__ __volatile__ (

  "push %ebx;"
  "cpuid;"
  "pop %ebx"
  : "=a"(__EAX), "=b"(__EBX), "=c"(__ECX), "=d"(__EDX)
  : "a"(__FUNC), "c"(__SUBFUNC)

);

Si la expresión que representa los operandos se interpreta en el momento incorrecto, entonces__EBX serán los salvadosEBX (y no elCPUID'sEBX), que probablemente será un puntero a la Tabla de desplazamiento global (GOT) si PIC está habilitado.

Donde, exactamente, la expresión especifica que el almacén deCPUID's%EBX dentro__EBX debería suceder (1) después de laPUSH %EBX; (2) después delCPUID; pero (3) antes delPOP %EBX?

Respuestas a la pregunta(2)

Su respuesta a la pregunta