2009-09-08 7 views
2

Juste pour expérimenter l'assemblage en C++, j'ai essayé ce qui suit, ce qui est à l'origine de l'application à l'accident:Utilisation de l'assemblage en ligne de C++

int APIENTRY _tWinMain(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPTSTR lpCmdLine, 
        int  nCmdShow) 
{ 
    __asm { 
push 5000 
call Sleep 
    } 

    ... 
} 

la partie du code assembleur est censé agir comme la ligne suivante

Sleep(5000); 

Qu'est-ce que je fais mal?

edit: J'obtiens une violation d'accès.

+1

ce qui se passe? qu'est-ce qui ne se passe pas? que dit le compilateur? quelles erreurs obtenez-vous? information manquante – LiraNuna

+0

Avez-vous un débordement de pile? –

+0

Violation d'accès, est l'erreur. –

Répondre

3

Je viens de vérifier le code assembleur dans VC++ 6.

Vous devez appeler la routine comme ceci:

call dword ptr [Sleep] 
0

Cela fait longtemps que je ne l'ai pas fait, mais je me souviens du passé que parfois je devais mettre un seul paramètre dans le registre EAX plutôt que de le pousser sur la pile. Ou peut-être avez-vous besoin de l'enlever à nouveau après les mots si la convention d'appel l'exige. Comme le dit Arak, vérifiez que vous correspondez à la convention d'appel du compilateur. Masm forcera une convention, vérifiez que votre compilateur C applique la même chose.

+0

Lors de l'écriture dans MASM, appuyez sur 5000 suivi de l'appel Le sommeil fonctionne parfaitement. –

0

Je ne suis pas un mec x86, mais je pense que vous devriez vérifier la convention d'appel utilisée par le compilateur. Il semble que Sleep nettoie après lui-même, alors peut-être que le compilateur insère le code de nettoyage aussi après cela?

3

Recopiez le code en droit en C - démonter, savoir ce que le compilateur fait, alors vous pouvez écrire une version correcte -

Questions connexes