2009-10-01 9 views
1

Je suis en train de inline un code d'assemblage dans mon code C:montage en ligne dans C: enregistre dynamique

__asm { mov reg,val }; 

Le problème: Je veux définir le registre et la valeur dynamique. Je sais que le 'val' peut être une variable écrite dans le code C, mais je ne sais pas comment choisir le registre dynamiquement (c'est-à-dire en fonction du registre d'entrée utilisateur 'dh' ou 'dl').

Des suggestions?

Répondre

4

Utilisez un ENUM et l'interrupteur dans le code C:

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; 
    ... 
} 
4

Eh bien ... Cela vous obliger à modifier le code lors de l'exécution.

La construction __asm { } se produit tout au moment de la compilation, de sorte que vous ne pouvez pas affecter son contenu plus tard. Bien sûr, self-modifying code n'est pas exactement ce que les systèmes d'exploitation modernes sont configurés pour faire le plus facile, vous devrez donc passer à travers quelques cerceaux (vidage de la mémoire cache, le code étant dans des segments non inscriptibles, et ainsi sur). Mise à jour: Bien sûr, vous pouvez utiliser la technique de slashmais et switch entre un ensemble de versions pré-compilées, mais je serais effrayé de mélanger le code à ce niveau (le clabaudage de registre me vient à l'esprit).