在程序集文件中调用C ++函数

时间:2017-10-12 04:48:23

标签: c++ assembly visual-c++ x86 masm

这是我第一次问这样我会在这里做到最好,但是我在组装任务上遇到麻烦,我给了一个.cpp文件(如下)并且必须创建一个包含的.asm文件a乘法,平方和除法功能。我遇到的一个问题是,在Square和Multiply函数完成后,我必须调用PrintResult来显示答案。对于除法,成功除法返回1,不成功除法返回0并调用PrintResult以显示失败消息。我不允许编辑他的.cpp文件,但我不知道如何成功调用PrintResult。我一直收到错误消息,说明有一个未定义的符号。

这是给出的.cpp:

#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;
    }
}

这就是我迄今为止的.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

目前我的_Square函数有我从这里得到的另一个答案,但不起作用。它告诉我PrintResult未定义。我已经写了_Multiply,但它当然没有调用,只要我知道格式化的东西看起来如此,我就可以在_Divide中写一下......

任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:0)

您可以使用EXTERN告诉汇编程序外部事物。

EXTERN _PrintResult

在这种情况下,您最好使用PROTOINVOKE MSDN : proto/invoke

 PrintDisplay PROTO C arg1:SWORD, arg2:SWORD

接着是

 INVOKE PrintDisplay 0, eax