¿Cómo se ve el lenguaje ensamblador multinúcleo?

Érase una vez, para escribir el ensamblador x86, por ejemplo, tendría instrucciones que indicaran "cargue el registro EDX con el valor 5", "incremente el registro EDX", etc.

Con las CPU modernas que tienen 4 núcleos (o incluso más), a nivel de código de máquina, ¿parece que hay 4 CPU separadas (es decir, solo hay 4 registros "EDX" distintos)? Si es así, cuando dice "incrementar el registro EDX", ¿qué determina qué registro EDX de la CPU se incrementa? ¿Existe un concepto de "contexto de CPU" o "hilo" en el ensamblador x86 ahora?

¿Cómo funciona la comunicación / sincronización entre los núcleos?

Si estuviera escribiendo un sistema operativo, ¿qué mecanismo está expuesto a través del hardware para permitirle programar la ejecución en diferentes núcleos? ¿Son algunas instrucciones especiales privilegiadas?

Si estuviera escribiendo un VM compilador / bytecode optimizador para una CPU multinúcleo, ¿qué necesitaría saber específicamente sobre, por ejemplo, x86 para que genere código que se ejecute de manera eficiente en todos los núcleos?

¿Qué cambios se han realizado en el código de máquina x86 para admitir la funcionalidad multinúcleo?