2014-11-30 6 views
3

어셈블러에서 C에서 사용할 함수를 만들려고합니다. 제 문제는 코드를 컴파일 할 수 없다는 것입니다. 나는 Visual studio 2012를 사용하고 있습니다. 나는 custiomization을 빌드 할 때 masm을 추가 했으므로 아이디어가 잘못되었습니다. C :해결되지 않은 외부 기호 C++ with Assembler

#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)" (? [email protected]@Y[email protected]) 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 
+4

"extern"C "int szukaj_max (int a, int b, int c);를 시도하십시오. – Jester

답변

3

함수 호출을 포함하는 주 파일의 컴파일러는 파일 이름이 ".cpp"로 끝나는 등 C++ 파일로 가정합니다. 따라서 컴파일러는 int szukaj_max (int a, int b, int c); 선언을 C++ 함수를 선언하는 것으로 해석합니다. 그러나 어셈블러 파일은 C 함수를 정의합니다.

가장 큰 차이점은 이름 변환에 있습니다. C++ 함수 용으로 생성 된 심볼 이름은 주로 링커에서 과부하 해결을 용이하게하기 위해 매개 변수에 대한 정보를 포함합니다. 따라서 간단한 기호 _szukaj_max은 찾아보기조차하지 않습니다. (나는 처음에 오류 메시지에 나타나는 __cdecl에 혼란 스러웠다. 그러나 매개 변수 전달 순서, 스택 정리 책임 등과 같은 ABI 문제는 이름 맹 글링이 아니고 ABI 문제를 정의합니다.)

"장식 된 이름"에 대한 자세한 내용은 마이크로 소프트가 호출로, 참조 here.

솔루션 :

정식 휴대용 방법은 주 파일의 기능 "통근 C"를 선언하는 것입니다
  • :
    extern "C" int szukaj_max(int a, int b, int c);
  • 컴파일러와 링커가 예상하는 방식으로 함수의 이름을 지정하십시오. 아마도 수동으로 이름을 함께 쓸 수도 있고 링커 오류를 살펴보아야합니다. 케이스의 이름은 [email protected]@[email protected] (앞에 밑줄이 없음)입니다. 이것은 다른 컴파일러가 다른 규칙을 가지고 있기 때문에 이식성이 없습니다. (그러나 MASM 어셈블러도 완전히 이식 가능하지 않을 수 있습니다.)
  • 실제로 C에서 프로그래밍하는 경우 컴파일러에서 선언 된 모든 함수가 C 함수라고 가정하도록 기본 파일 이름의 확장명을 ".c"로 변경하십시오 그건 앤지의 올바른 해결책입니다). 그것은 다시 휴대해야합니다.
2

는 "이 .c는"하지 " 통화 당은"내가 가진 동일한 문제 그렇게함으로써 해결되었습니다.

+0

좋은 힌트. 그것은 내가 VS의 2013 Pro에 OP의 파일을 복사 할 때 나를 위해 그것을했다. Downvoter는 설명하기 위하여 걱정 하는가? –