2010-10-28 3 views
3

Je transfère le code C++ 32 bits en 64 bits dans VS2008. L'ancien code a un code mixte écrit en assembly.
Exemple:Code d'assemblage mélangé avec mon code C++. Comment porter en 64 bits

__asm 

{ 
    mov esi, pbSrc 
    mov edi, pbDest 

    ... 

} 

Je l'ai lu quelque part que je dois enlever tout le code d'assemblage et les mettre tous dans un projet distinct et lien en quelque sorte à lui. Quelqu'un peut-il me donner la procédure étape x étape pour le faire. Je connais C++ & C# mais je ne connais pas le langage d'assemblage. Merci d'avance.

Répondre

1

Si vous ne pouvez pas utiliser les fonctions intrinsèques pour effectuer vos tâches, ou si vous ne pouvez pas écrire l'équivalent en C/C++, vous devrez plonger dans le langage d'assemblage x64. De haut niveau:

1) En supposant que vous débutiez avec les routines de langage d'assemblage x86, vous devrez les porter sur x64.

2) Utilisez ML64 (assembleur Microsoft x64) ou un assembleur équivalent pour assembler vos routines en .OBJ que vous pouvez lier dans votre projet C/C++.

3) Configurez une étape de construction personnalisée qui appelle l'assembleur sur vos fichiers .ASM.

Bonne chance!

+0

Il est temps de vérifier ML64. Merci. – ramrocket

4

Visual C++ 2005, 2008 ou 2010 ne prend pas en charge l'incorporation d'assembly lors de la compilation pour les plates-formes 64 bits. x64 ASM a juste trop de complexités et de complexités qui peuvent bousiller le code C (++) autour du bloc __asm afin qu'ils ne le permettent pas. En bref, il n'y a aucun moyen de le "porter".

Je suggère d'utiliser l'intrinsèque 64 bits avec #define et #ifdef en essayant de croiser l'architecture d'un tel code de bas niveau. Départ: http://msdn.microsoft.com/en-us/library/h2k70f3s.aspx

Modifier: Si vous savez vraiment ce que vous faites, mais vous pouvez enregistrer les bytecode appropriés ASM en quelque sorte d'une matrice de tampon et d'exécuter que « brut » - via un pointeur void* et VirtualProtect() ou quelque chose de similaire. Bien sûr, vous devez comprendre les conventions d'appel/de retour x64 puisque vous appelez essentiellement une fonction. Notez que ceci est 99,9% du temps mauvaise idée.

Questions connexes