Я пытаюсь сделать функцию в ассемблере, чтобы использовать ее в C. Моя проблема в том, что я не могу скомпилировать свой код. Я использую Visual Studio 2012. Я добавил MASM в Custiomization сборки, поэтому я понятия не имею, что не так.
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, такие как порядок передачи параметров, обязанности по очистке стека и т. д., а не искажение имени.)
Для получения дополнительной информации о «украшенных именах», как называет это Microsoft, см. Вот.
Решение:
extern "C" int szukaj_max(int a, int b, int c);
?szukaj_max@@YAHHHH@Z
(без подчеркивания). Это не переносимо, потому что другие компиляторы имеют другие соглашения. (Но тогда ассемблер MASM может быть и не полностью переносимым.)Вы должны назвать файл «.с «не».cpp «У меня была такая же проблема, и она была решена таким образом.