Pregunta

Estoy intentando inline algún código ensamblador en mi código C:

__asm { mov reg,val };

El problema: Quiero definir el registro y el valor de forma dinámica. Sé que el 'val' puede ser una variable escrita en el código C, pero no sé cómo puedo elegir el registro de forma dinámica (es decir, decidir en función del usuario entrada-registro 'dh' o 'dl').

¿Alguna sugerencia?

¿Fue útil?

Solución

Utilice una enumeración y el interruptor en el C-código:

typedef enum
{
  R_AL,
  R_AH,
  R_AX,
  R_EAX,
...
} REGS;
...
REGS nReg;
...
switch (nReg)
{
    case R_AL: __asm { mov al,val } break;    
    case R_AH: __asm { mov ah,val } break;    
    case R_AX: __asm { mov ax,val } break;
    ...
}

Otros consejos

Bueno ... Para ello sería necesario que modificar el código en tiempo de ejecución.

La construcción __asm { } sucede todo en tiempo de compilación, por lo que no puede afectar a su contenido más adelante.

Por supuesto, código mutante no es exactamente lo que los sistemas operativos modernos son creado para hacer más fácil, por lo que vamos a tener que saltar a través de unos aros (enrojecimiento caché, el código de estar en segmentos no modificables, y así sucesivamente).

Actualización: Por supuesto, es posible que pueda utilizar la técnica y switch de slashmais entre un conjunto de versiones pre-compilados, pero estaría miedo de mezclar código en ese nivel (registro clobbering viene a la mente)

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