Pan*_*sky 3 c++ assembly mixed
我试图在汇编程序中创建函数以在 C 中使用它。我的问题是我无法编译我的代码。我正在使用 Visual Studio 2012。我在构建自定义中添加了 masm,所以我不知道出了什么问题。C:
#include <stdio.h>
int szukaj_max (int a, int b, int c);
int main()
{
int x, y, z, wynik;
printf("\nProsz?poda?trzy liczby ca?kowite: ");
scanf_s("%d %d %d", &x, &y, &z, 32);
wynik = szukaj_max(x, y, z);
printf("\nSpo?ród podanych liczb %d, %d, %d, \ liczba %d jest najwi?ksza\n", x,y,z, wynik);
return 0;
Run Code Online (Sandbox Code Playgroud)
集会:
.686
.model flat
public _szukaj_max
.code
_szukaj_max PROC
push ebp ; zapisanie zawarto?ci EBP na stosie
mov ebp, esp ; kopiowanie zawarto?ci ESP do EBP
mov eax, [ebp+8] ; liczba x
cmp eax, [ebp+12] ; porownanie liczb x i y
jge x_wieksza ; skok, gdy x >= y
; przypadek x < y
mov eax, [ebp+12] ; liczba y
cmp eax, [ebp+16] ; porownanie liczb y i z
jge y_wieksza ; skok, gdy y >= z
; przypadek y < z
; zatem z jest liczb?najwieksz?
wpisz_z:
mov eax, [ebp+16] ; liczba z
zakoncz:
pop ebp
ret
x_wieksza:
cmp eax, [ebp+16] ; porownanie x i z
jge zakoncz ; skok, gdy x >= z
jmp wpisz_z
y_wieksza:
mov eax, [ebp+12] ; liczba y
jmp zakoncz
_szukaj_max ENDP
END
Run Code Online (Sandbox Code Playgroud)
错误:
Error 2 error LNK2019: unresolved external symbol "int __cdecl szukaj_max(int,int,int)" (? szukaj_max@@YAHHHH@Z) referenced in function _main C:\Users\Kaczor\Desktop\Ako\4.1\4.1\Source.obj
Error 3 error LNK1120: 1 unresolved externals C:\Users\Kaczor\Desktop\Ako\4.1\4.1\Debug\4.1.exe 1
Run Code Online (Sandbox Code Playgroud)
包含函数调用的主文件的编译器假定它是一个 C++ 文件,例如因为文件名以“.cpp”结尾。因此,编译器将声明解释int szukaj_max (int a, int b, int c);为声明 C++ 函数。但是,您的汇编程序文件定义了一个 C 函数。
主要区别在于名称修改:为 C++ 函数生成的符号名称包含有关参数的信息,主要是为了便于链接器进行重载解析。因此,_szukaj_max甚至不寻找简单的符号。(我最初对__cdecl出现在错误消息中感到困惑,但这定义了 ABI 问题,例如参数传递的顺序、堆栈清理职责等,而不是名称修改。)
有关 Microsoft 所称的“修饰名称”的更多信息,请参见此处。
解决方案:
extern "C" int szukaj_max(int a, int b, int c);?szukaj_max@@YAHHHH@Z(不带前导下划线)。这是不可移植的,因为其他编译器有不同的约定。(但是 MASM 汇编器可能也不是完全可移植的。)小智 5
我相信有些解决方案可能不完整,所以我只是添加我的过程,希望它对任何人都有帮助。
安装程序是 x64 Windows 10 上的 Visual Studio 2015,文件扩展名为 .cpp(针对 x64 进行编译)。我试图在我的 Visual Studio MFC 应用程序中运行来自 al-khaser 的 int2d_x64.asm。
我发现LALLOUS' LAB 的这篇文章以及Mike Danes 在 msdn 上的回答 非常有帮助,简而言之:
extern "C" void __int2d();(对于OP的情况,这将是@Peter - Reinstate Monica建议的extern "C" int szukaj_max(int a, int b, int c);:)