Je reçois une valeur de retour différente chaque fois, donc je fais quelque chose de mal. Si je remplace le ajouter avec une base inc, il renvoie correctement.La fonction d'assemblage en ligne C++ ne fonctionne pas correctement
Voici le code.
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <iostream>
using namespace std;
int Add (int _Number1, int _Number2);
int main (int _ArgumentCount, char * _Arguments[])
{
int nInput, nOutput;
nOutput = Add (1, 1);
cout << "1 + 1 = " << nOutput << endl;
cin >> nInput;
return 0;
}
__declspec (naked) int Add (int _Number1, int _Number2)
{
__asm xor eax, eax
__asm mov eax, _Number1
__asm add eax, _Number2
__asm ret
}
Voici le nouveau code de travail:
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <iostream>
using namespace std;
int Add (int Number1, int Number2);
int main (int ArgumentCount, char * Arguments[])
{
int nInput, nOutput;
nOutput = Add (1, 1);
cout << "1 + 1 = " << nOutput << endl;
cin >> nInput;
return 0;
}
int Add (int Number1, int Number2)
{
__asm mov eax, Number1
__asm add eax, Number2
}
Comment savez-vous que '_Number1' n'est pas' eax'? Le compilateur est autorisé à appeler des fonctions avec leurs arguments dans des registres. Je pense que votre problème est que vous n'avez fait aucun effort pour éviter de marcher sur les orteils du compilateur en déclarant vos registres utilisés, etc. Jetez un coup d'oeil à votre démontage de programme pour preuve. – Borealid
Pourquoi utilisez-vous '__declspec (nu)'? Êtes-vous sûr de devoir faire cela? Que se passe-t-il si vous ne le faites pas? –
@Borealid - Ceci est ma première tentative, pas vraiment sûr de ce que je fais. Je pensais que EAX était réservé pour les valeurs de retour, quels registres dois-je utiliser? @Greg - Avait quelques problèmes de compilation sans elle. Google recherché, et un gars sur un forum a dit d'utiliser la déclaration nue. –