Я обычно не люблю публиковать полный код для вещей, но попробуйте:
32-битная сборка
.386
.model flat
.code
_Square proc
mov eax, [esp+4]
imul eax
push eax ; Save the calculated result
; Call PrintResult here
push eax ; value
push 0 ; ShowSquare
call _PrintResult
add esp, 8 ; Clear the stack
pop eax ; Return the calculated result
ret
_Square endp
C ++
#include <iostream>
using namespace std;
enum ResultCode {ShowSquare};
enum SuccessCode {Failure, Success};
extern "C" long Square(long);
int main(int argc, char* argv[])
{
long Num1, Num2;
do
{
cout << "Enter number to square" << endl;
cin >> Num1;
Num2 = Square(Num1);
cout << "Square returned: " << Num2 << endl;
}
while (Num2);
return 0;
}
extern "C"
void PrintResult(ResultCode result, long value)
{
switch (result)
{
case ShowSquare:
cout << "Square is: " << value << endl;
break;
default:
cout << "Error calculating square" << endl;
break;
}
}
Поскольку вы пишете программу на C, механизм вызова по умолчанию - cdecl , что означает, что все параметры передаются в стеке, возвращаемое значение передается обратно в eax
, ивызывающая сторона ответственна за очистку стека впоследствии.
Таким образом, чтобы вызвать PrintResult, вы должны поместить все свои параметры в стек перед вызовом процедуры.И после завершения процедуры мы должны очистить наш стек (add esp, 8
).
Поскольку соглашение о вызовах cdecl позволяет изменять eax
во время вызова, eax
может не сохраниться при возврате PrintResult, поэтому мы сохраняем вычисленный результат перед вызовом PrintResult и затем восстанавливаем его после возврата вызова.
Я не пробовал приведенный выше код, но надеюсь, что он поможет вам снизитьправильный путь.
Примечание: Поскольку вы используете компилятор C ++, требуется extern "C"
перед PrintResult.