未使用汇编程序的外部符号C.

我试图在汇编程序中使用它在C中使用它.我的问题是我无法编译我的代码.我正在使用Visual Studio 2012.我在构建custiomization中添加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; 

部件:

.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 

错误:

 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

解决方法:

包含函数调用的主文件的编译器假定它是C文件,例如因为文件名以“.cpp”结尾.因此,编译器解释声明int szukaj_max(int a,int b,int c);声明一个C函数.但是,汇编程序文件定义了C函数.

主要区别在于名称修改:为C函数生成的符号名称包含有关参数的信息,主要是为了便于链接器的重载解析.因此,甚至没有寻找简单的符号_szukaj_max. (我最初对出现在错误消息中的__cdecl感到困惑,但是它定义了ABI问题,如参数传递顺序,堆栈清理职责等,而不是名称错误.)

有关“装饰名称”的更多信息,请参阅here.

解:

>规范和可移植的方法是在主文件中声明函数“extern C”:
extern“C”int szukaj_max(int a,int b,int c);
>按照编译器和链接器期望的方式命名函数.您可以手动将名称拼凑在一起,或者只是查看链接器错误:您的案例中的名称是?szukaj_max @@ YAHHHH @Z(没有前导下划线).这是不可移植的,因为其他编译器具有不同的约定. (但是MASM汇编程序可能也不是完全可移植的.)
>或者,如果您实际上是用C编程,请将主文件名的扩展名更改为“.c”,以便编译器假定所有声明的函数都是C函数(这是Ange的正确解决方案).这应该是便携式的.

上一篇:php调用回调与闭包


下一篇:php之unset用法