2017-10-12 3 views
2

C'est la première fois que je demande, je vais faire de mon mieux ici, mais j'ai des problèmes avec une tâche d'assemblage dans laquelle je reçois un fichier .cpp (ci-dessous) et je dois Créez un fichier .asm contenant des fonctions Multiply, Square et Divide. La partie avec laquelle je rencontre un problème est qu'après l'exécution des fonctions Square et Multiply, je dois appeler PrintResult pour afficher la réponse. Pour la division, une division réussie renvoie un 1 et un échec renvoie un 0 et appelle PrintResult pour afficher le message d'échec. Je ne suis pas autorisé à modifier son fichier .cpp, mais je ne sais pas comment appeler avec succès PrintResult. Je continue à recevoir une erreur qui dit qu'il y a un symbole indéfini.Appel de fonctions C++ dans un fichier d'assemblage

Voici le Cpp donné:

#include <iostream> 

using namespace std; 

enum ResultCode { ShowSquare, ShowMultiply, ShowDivide, ShowRemainder, ShowDivideFailure }; 
enum SuccessCode { Failure, Success }; 

extern "C" SuccessCode Divide(long, long, long &, long &); 
extern "C" long Multiply(long, long); 
extern "C" void PrintResult(ResultCode, long); 
extern "C" long Square(long); 

void main() 
{ 
    long Num1; 
    long Num2; 
    long Result; 
    long Remainder; 
    do 
    { 
     cout << "Enter Number to Square" << endl; 
     cin >> Num1; 
     Result = Square(Num1); 
     cout << "Square is: " << Result << endl; 
     cout << "Enter two numbers to multiply" << endl; 
     cin >> Num1 >> Num2; 
     Result = Multiply(Num1, Num2); 
     cout << "Result of multiply is: " << Result << endl; 
     cout << "Enter mumber to divide into then number to divide by" << endl; 
     cin >> Num1 >> Num2; 
     if (Divide(Num1, Num2, Result, Remainder) == Success) 
      cout << "Result is " << Result << " and remainder is " << Remainder << endl; 
     else 
      cout << "Attempted division by zero"; 
    } while (Result > 0); 
} 

void PrintResult(ResultCode PrintCode, long Value) 
{ 
    switch (PrintCode) 
    { 
    case ShowSquare: 
     cout << "Display of square is: " << Value << endl; 
     break; 
    case ShowMultiply: 
     cout << "Display of multiply is: " << Value << endl; 
     break; 
    case ShowDivide: 
     cout << "Display of divide is " << Value << endl; 
     break; 
    case ShowRemainder: 
     cout << "Display of remainder is " << Value << endl; 
     break; 
    case ShowDivideFailure: 
     cout << "Display of Division by zero" << endl; 
     break; 
    default: 
     cout << "Error in assembly routines" << endl; 
    } 
} 

Et voici ce que j'ai jusqu'à présent en tant que fichier .asm:

.386 
.model flat 
.code 

public _Square 
public _Multiply 
public _Divide 


_Square  proc 
      mov  eax, [esp + 4] 
      imul eax, eax 
      push eax 

      push eax 
      push 0 
      call _PrintResult 
      add  esp, 8 

      pop  eax 

      ret 
_Square  endp 

_Multiply proc 
      mov  eax, [esp + 8] 
      mov  ebx, [esp + 4] 
      imul eax, ebx 


      ret 
_Multiply endp 

_Divide  proc 


      ret 
_Divide  endp 


end 

Actuellement ma fonction _Square a ce que je tiré d'une autre réponse ici, mais ne fonctionne pas. Il me dit que PrintResult est indéfini. J'ai mon _Multiply écrit mais il n'a pas l'appel bien sûr et je peux écrire dans le _Divide dès que je sais comment le formatage quelque chose comme ça aurait l'air ..

Toute aide est plus qu'appréciée!

+0

Note: Les coureurs ne font pas javascript C++. – user4581301

+0

Merci beaucoup, je ne pouvais pas comprendre comment formater correctement. De cette façon semblait le plus facile de tout séparer et de ne pas couper les lignes. – Arcadiaen

+1

Vous devrez indiquer à votre code MASM que '_PrintResult' est une étiquette externe. Ajoutez ceci au début de votre code d'assembleur 'extern _PrintResult: near' –

Répondre

0

Vous pouvez utiliser EXTERN pour indiquer à l'assembleur des éléments externes.

EXTERN _PrintResult 

Dans ce cas, vous pouvez être mieux en utilisant PROTO et INVOKE MSDN : proto/invoke

PrintDisplay PROTO C arg1:SWORD, arg2:SWORD 

suivie

INVOKE PrintDisplay 0, eax 
+0

Dans MASM [EXTERN] (https://msdn.microsoft.com/en-us/library/7cycf5bc.aspx) requiert un deux-points ':' et un type, donc je ne crois pas que 'EXTERN _PrintResult' serait assemblé correctement sans erreur. –