使用C ++代码中的参数调用masm函数

问题描述

这是汇编代码

.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并删除原型行-我可以从c ++调用它,但是如果我想传递一些参数,则需要在过程后添加它们标头,这意味着我需要添加stdcall,在这种情况下,c ++告诉我程序找不到我的函数(未解析的外部符号_asmFunc),我真的找不到任何正常的组合(因为我不想通过传递参数通过寄存器或手动将它们放入堆栈,然后将其放入我的函数中(太多额外的代码),这使我可以使用c ++中的参数来调用asm函数,要么它没有参数,要么c ++代码找不到它

解决方法

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

  2. 由于在.model指令中指定了语言类型,因此会自动执行名称修饰。这意味着您不应在名称中添加诸如_之类的名称修饰,这些名称修饰将根据指定的调用约定按照name mangling rules修饰。

,

asm代码中的函数名称开头应不带_,因为asm会自动添加下划线