&引用;错误LNK2019:未解析的外部符号\u长_add@12在函数“U main”中引用;在C++; 我试图使用一个程序集(FASM)作为C++中的一个函数,但它似乎不起作用,即使我链接了编译的对象。有什么建议吗

&引用;错误LNK2019:未解析的外部符号\u长_add@12在函数“U main”中引用;在C++; 我试图使用一个程序集(FASM)作为C++中的一个函数,但它似乎不起作用,即使我链接了编译的对象。有什么建议吗,c++,visual-studio,assembly,fasm,C++,Visual Studio,Assembly,Fasm,C++程序: #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <stdio.h> #include <string.h> using namespace std; extern "C" { unsigned int __stdcall long_add(int*, int*, int*); } int main() { int testOne[3]

C++程序:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;
extern "C"
{
    unsigned int __stdcall long_add(int*, int*, int*);
}

int main()
{
    int testOne[3] = { 0x12345678, 0x04000000, 0xFFFFFFFF };
    int testTwo[3] = { 0x12345678, 0x04000000, 0xFFFFFFFF };
    int testOut[3] = {};

    long_add(testOne, testTwo, testOut);

    scanf;
}
链接证明:

编辑:我试图将数组地址移动到寄存器中,结果代码如下:

format MS COFF 

public long_add as '_long_add@12'

section '.code' code readable executable

proc long_add IN_NUM1, IN_NUM2, OUT_NUM

start:

        mov ecx, 3
        clc
        mov edi, [IN_NUM1]
        mov esi, [IN_NUM2]
        
ADDING:

        mov eax, [edi+(ecx-1)*4]
        mov ebx, [esi+(ecx-1)*4]
        adc eax, ebx
        push eax
        loop ADDING
        
        mov esi, [OUT_NUM]
        mov ecx, 3
        
POPPING:
        
        pop eax
        mov [esi], eax
        inc esi
        loop POPPING
        
        ret
        endp

当我尝试添加{0x12345678,0x04000000,0xFFFFFFFF}和{0x87654321,0x020000000,0x00000001}时,它返回{409,0,0}。

它正在寻找
..@12
,您将符号导出为
..@32
。根据该数字表示作为参数传递的字节,因此,对于三个指针来说,32是不可能的。此外,除了符号名错误,您还需要修复
ret12
。验证调用者和被调用者之间对此调用者的一致性pops堆栈调用约定是使用
@12
@4
装饰函数名的关键。确切地说,您只有
ret
无法弹出调用者的参数,违反了
stdcall
调用约定。考虑到您的
proc long\u外接程序innum1、innum2、outnum
声明,您可能只是在修改堆栈(其中包含指针),而不是指向的数据。您需要将这些指针加载到寄存器中,以便对其进行解引用;x86没有内存间接寻址模式。使用反汇编程序查看您实际从MASM中得到了什么机器指令:当您还不了解以这种方式使用MASM时会发生什么情况时,它是“高级”的东西可能与“有用”相反。
format MS COFF 

public long_add as '_long_add@12'

section '.code' code readable executable

proc long_add IN_NUM1, IN_NUM2, OUT_NUM

start:

        mov ecx, 3
        clc
        mov edi, [IN_NUM1]
        mov esi, [IN_NUM2]
        
ADDING:

        mov eax, [edi+(ecx-1)*4]
        mov ebx, [esi+(ecx-1)*4]
        adc eax, ebx
        push eax
        loop ADDING
        
        mov esi, [OUT_NUM]
        mov ecx, 3
        
POPPING:
        
        pop eax
        mov [esi], eax
        inc esi
        loop POPPING
        
        ret
        endp