Domanda

Sto cercando di inline qualche codice assembly nel mio codice C:

__asm { mov reg,val };

Il problema: voglio definire il registro e valore in modo dinamico. So che il 'val' può essere una variabile scritto in codice C, ma io non so come posso scegliere il registro in modo dinamico (cioè decidere in base alla user input-registro 'dh' o 'dl').

Qualche suggerimento?

È stato utile?

Soluzione

Utilizzare un enum e interruttore nel C-codice:

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

Altri suggerimenti

Beh ... Ciò richiederebbe di modificare il codice in fase di esecuzione.

Il costrutto __asm { } accade tutto a tempo di compilazione, quindi non è possibile influenzare il suo contenuto in seguito.

Naturalmente, auto-modificare il codice non è esattamente ciò che i sistemi operativi moderni sono impostare fino a fare la maggior parte facile, così si sta andando ad avere per saltare attraverso un paio di cerchi (cache di vampate di calore, il codice essendo in segmenti non scrivibili, e così via).

Aggiornamento: Naturalmente si potrebbe essere in grado di utilizzare la tecnica e switch di slashmais tra una serie di versioni pre-compilato, ma sarei paura di mescolare il codice a quel livello (registro clobbering viene in mente)

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top