【问题标题】:call masm function with arguments from c++ code使用 c++ 代码中的参数调用 masm 函数
【发布时间】:2020-10-07 12:05:28
【问题描述】:

这里是汇编代码:

.386
.model flat, stdcall

_asmFunc proto arg1: dword, arg2: dword

.data
.code

_asmFunc proc, arg1: dword, arg2:dword
    mov eax, arg1
    add eax, arg2
    ret
_asmFunc endp

end

这里是 c++ 代码:

#include <iostream>

extern "C" int asmFunc(int, int);

int main()
{
    std::cout << asmFunc(5, 6);

    char a;
    std::cin >> a;
    return 0;
}

问题是:如果我从函数中删除所有参数,请从 asm 中的模型中删除 stdcall 并删除 proto 行 - 我可以从 c++ 中调用它,但如果我想传递一些参数,我需要在程序之后添加它们标头,这意味着我需要添加stdcall,在这种情况下,c ++告诉我程序找不到我的函数(未解析的外部符号_asmFunc),我真的找不到任何正常的组合(因为我不想通过参数传递通过寄存器手动或手动将它们放入堆栈并在我的函数中取出它们,太多额外代码)允许我使用来自 c++ 的参数调用 asm 函数,要么它不能有参数,要么 c++ 代码找不到它

【问题讨论】:

  • 您的 C++ 和汇编代码需要就调用约定达成一致。在你的汇编代码中使用.model flat, c,或者在你的C++代码的函数声明中添加__attribute__((__stdcall__))
  • 我的错,忘了提,我都试过了,在添加模型平面的情况下,c而不是模型平面,stdcall没有改变,c++仍然找不到函数(在c++代码中试过添加 __cdecl、__stdcall 和什么都没有,这些都没有帮助),就模型平面而言,stdcall 也尝试将所有三种变体添加到 c++ 代码中 - 没有帮助,只有在 asm 和 c++ 代码都有模型平面、stdcall 和__stdcall - 错误消息中的函数名称变为 _asmFunc@8 而不仅仅是 _asmFunc,也没有设法修复此错误
  • 您不应自己在名称中添加下划线。 MASM 为您做到这一点。
  • 谢谢,不知道这个细节,你真棒

标签: c++ assembly masm


【解决方案1】:
  1. .model 指令中的调用约定必须与 C 函数声明中的调用约定相匹配。对于默认的cdecl 调用约定,只需使用.model flat, c

  2. 作为在.model 指令中指定语言类型的结果,会自动执行名称修饰。这意味着您不应在名称中添加任何名称装饰,例如 _,这些名称将根据指定调用约定的 name mangling rules 进行装饰。

【讨论】:

    【解决方案2】:

    asm代码中的函数名不能以_开头,asm自己加下划线

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-06
      • 2021-10-17
      • 2020-07-27
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 2013-10-01
      相关资源
      最近更新 更多