2

Je ne comprends pas pourquoi ce codeErreur de compilation avec l'assembleur intégré

#include <iostream> 
using namespace std; 
int main(){ 
    int result=0; 

    _asm{ 
     mov eax,3; 
     MUL eax,3; 
     mov result,eax; 
    } 

    cout<<result<<endl; 
    return 0; 
} 

montre l'erreur suivante.

1> c: \ users \ documents \ david \ Visual Studio 2010 \ projects \ assembler_instructions \ assembler_instructions.cpp (11): erreur C2414: nombre illégal d'opérandes

Tout semble bien, et Pourtant, pourquoi ai-je cette erreur de compilation?

+0

J'ai ajouté les balises Visual Studio et assembleur, car cette question a peu d'intérêt pour C++. –

+0

Je n'ai aucun de mes documents de référence à portée de main pour le moment, et j'échoue chez google ... Ce n'est pas MUL reg, imm illégal (au moins en mode compatible 8086, qui pourrait être ce que le compilateur par défaut à)? –

Répondre

2

Utilisation :

imul eax, 3; 

ou:

imul eax, eax, 3; 

De cette façon, vous n'avez pas besoin de vous inquiéter de l'effondrement d'edx -register. C'est "nombre entier signé". Vous semblez avoir un résultat «int», cela ne devrait donc pas avoir d'importance si vous utilisez mul ou imul.

Parfois, j'ai des erreurs à cause de l'absence de mise à zéro du registre edx lors de la division ou de la multiplication. Le processeur était Intel Core2 quad Q9550

Il existe des manuels de référence d'instruction intel engourdis mais corrects, que vous pouvez lire. Bien qu'intel a cassé ses sites Web il y a longtemps. Vous pourriez essayer de trouver les mêmes manuels de référence sur les sites AMD.

Mise à jour: J'ai trouvé le manuel: http://www.intel.com/design/pentiumii/manuals/243191.htm

Je ne sais pas quand ils vont briser à nouveau leurs sites, si vous avez vraiment besoin toujours chercher vers le haut.

Mise à jour 2: ARGHL! ceux-ci datent de l'année 1999 ... et bien la plupart des détails sont malheureusement les mêmes.

+1

* I * comme les manuels d'instructions Intel. :) –

11

Selon this page, l'instruction mul prend qu'un seul argument:

mul arg

Ceci multiplie "arg" par la valeur de l'octet de longueur correspondante dans l'un registre, voir tableau ci-dessous :

la taille de l'opérande 1 octet 2 octets 4 octets

autre opérande AL AX EAX

plus partie du résultat stocké dans: AH DX EDX

partie inférieure du résultat stocké dans: AL AX EAX

+1

@Davit: En d'autres termes, essayez simplement 'mul 3'. –

+1

Vous devez utiliser un autre registre dans l'opérateur MUL –

4

Ainsi suivant les notes que par le lien de Justin:

#include <iostream> 

int main() 
{ 
    int result=0; 

    _asm{ 
     mov eax, 3; 
     mov ebx, 4; 
     mul ebx; 
     mov result,eax; 
    } 

    std::cout << result << std::endl; 

    return 0; 
} 
1

Vous devez télécharger les manuels d'architecture Intel.

http://www.intel.com/products/processor/manuals/

Pour votre objectif, le volume 2 va vous aider le plus.

En date d'accès en juillet 2010, ils sont à jour.

+0

Comment les avez-vous trouvés? – Cheery

+0

@Cheery: référence du jeu d'instructions 'intel x86'. Ce lien pointe vers les manuels de l'édition de juin 2010. –