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