2011-07-30 1 views
2

Je convertir un code de ASM en C++, l'ASM ressemble tout simplement comme ceci:emballage un int dans un champ de bits en C++

mov dword ptr miscStruct, eax 

struct ressemble:

struct miscStruct_s { 
    uLong brandID  : 8, 
    chunks   : 8, 
    //etc 
} miscStruct; 

est-il un moyen facile de deux lignes pour remplir la structure en C++? Jusqu'à présent, je me sers:

miscStruct.brandID = Info[0] & 0xff; //Info[0] has the same data as eax in the ASM sample. 
miscStruct.chunks = ((Info[0] >> 8) & 0xff); 

Cela fonctionne très bien et tout, mais je dois remplir une 9-10 de ces structs BITFIELD, certains d'entre eux ont 30 champs impairs. Le faire de cette façon finit par transformer 10 lignes de code en 100+ ce qui n'est évidemment pas si bien.

Y a-t-il une manière simple et propre de répliquer l'ASM en C++?

J'ai bien sûr essayé "miscStruct = CPUInfo [0];" mais C++ n'aime pas ça malheureusement. :(

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' 

..Et Je ne peux pas modifier le struct.

+0

Je fini par utiliser: '* reinterpret_cast (& miscStruct) = Info [0];' – Riley

Répondre

1

La traduction littérale de l'instruction assembleur est ceci:

miscStruct=*(miscStruct_s *)&Info[0]; 

Les moulages sont nécessaires parce que C++ est un langage de type sécurisé, alors que l'assembleur n'est pas, mais la sémantique de copie sont identiques.

+0

J'ai fini par le faire à l'envers en fonction de votre exemple. * Reinterpret_cast (& miscStruct) = Info [0]; C'est un peu génial mais ça semble faire l'affaire. – Riley

+0

@Riley, tout ce qui fonctionne, la principale différence entre les deux est de quel côté vous considérez la "vraie" longueur. Personnellement, je choisirais l'objet en mémoire ('miscStruct') comme étant la vraie longueur afin que vous ne puissiez jamais l'écraser, alors que dans votre exemple, si vous changez par la suite' miscStruct' pour avoir un seul caractère, vous corromprez votre Mémoire. – Blindy

1

memcpy (&miscStruct, &CPUInfo[0], sizeof (struct miscStruct_s));

devrait aider.

ou simplement

int *temp = &miscStruct; 
*temp = CPUInfo[0]; 

Ici j'ai supposé que le type de CPUInfo est int. Vous devez ajuster le type de pointeur temp avec le type de données du tableau CPUInfo. Il suffit de transcrire l'adresse mémoire de la structure en type de tableau et d'y affecter la valeur en utilisant le pointeur.

+0

memcpy (& miscStruct, & CPUInfo [0], sizeof (miscStruct)); – Ajay

Questions connexes