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

Posted

技术标签:

【中文标题】在程序集文件中调用 C++ 函数【英文标题】:Calling C++ Functions Inside an Assembly File 【发布时间】:2017-10-12 04:48:22 【问题描述】:

这是我第一次问,所以我会在这里尽力而为,但是我在组装作业中遇到了麻烦,在该作业中我得到了一个 .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 中写入

任何帮助都非常感谢!

【问题讨论】:

注意:javascript 运行器不使用 C++。 非常感谢,我不知道如何正确格式化。这种方式似乎最容易将所有内容分开而不是剪线。 你必须告诉你的 MASM 代码 _PrintResult 是一个外部标签。将此添加到汇编代码的顶部 extern _PrintResult:near 我很快就输入了。因为它是一个过程,你可能想这样做extern _PrintResult:proc 所以对于正方形,如果我输入 3 应该输出“正方形的显示为:9\t 正方形为:9”? 【参考方案1】:

您可以使用EXTERN 告诉汇编器外部的事情。

EXTERN _PrintResult

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

 PrintDisplay PROTO C arg1:SWORD, arg2:SWORD

紧随其后

 INVOKE PrintDisplay 0, eax

【讨论】:

在 MASM 中 EXTERN 需要一个冒号 : 和一个类型,所以我不相信 EXTERN _PrintResult 会正确组装而不会出现错误。

以上是关于在程序集文件中调用 C++ 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在非托管 c++ dll 中查找调用方程序集名称

在 asp.net 中使用 c++ dll - 异常:无法加载文件或程序集

多个线程使用不同的参数值集调用相同的函数

在 C++ 中的函数内执行程序集

使用 C++ 和嵌入式单声道调用 C# DLL 时无法加载程序集系统

无法加载文件或程序集“Microsoft.WindowsAzure.Storage”Azure 函数