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!
Note: Les coureurs ne font pas javascript C++. – user4581301
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
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' –