Как вызвать функции C ++ в моем ассемблерном коде - PullRequest
1 голос
/ 12 октября 2010

Мне нужно вызвать PrintResult из моей сборки, чтобы отобразить результат.Я знаю, что где-то должен использовать extrn _PrintResult, и мне следует вызывать функцию с помощью вызова _PrintResult, но я не совсем уверен, как его использовать.любые предложения

public _Square

.386

.model flat

.code

_Square proc

mov eax, [esp+4]

imul eax

ret

_Square endp

............. Вот мой код C ++ .........

#include <iostream>

using namespace std;

enum ResultCode {ShowSquare};
enum SuccessCode {Failure, Success};

extern "C" long Square (long);

void main ()
 {
 long Num1; 
         long Num2;

 do
  {
  cout << "Enter Number to Square" << endl;
  cin >> Num1;
  Result = Square (Num1);
  cout << "Square is: " << Result << endl;
  } while (Result > 0);
 }

void PrintResult (ResultCode PrintCode, long Value) //PrintCode, long Value)
 {
 switch (PrintCode)
  {
  case ShowSquare:
    cout << "Display of square is: " << Value << endl;
    break;

  default:
    cout << "Error in assembly routines" << endl;
  }
}

1 Ответ

5 голосов
/ 12 октября 2010

Я обычно не люблю публиковать полный код для вещей, но попробуйте:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...