簡體   English   中英

如何在我的匯編代碼中調用C ++函數

[英]How to call C++ functions in my assembly code

我需要從我的程序集中調用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;
  }
}

我通常不喜歡發布完整的代碼,但是可以嘗試一下:

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 ++編譯器,所以在PrintResult之前必須加上extern "C"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM