Autor Wątek: Yasm + Visual Studio 2010  (Przeczytany 2370 razy)

Offline Witek9002

  • Użytkownik

# Lipiec 30, 2012, 22:31:56
Witam,
mam problem z współpracą assemblera Yasm z Visual Studio 2010 Ultimate. Napisałem programik (main.cpp):
#include <stdlib.h>
#include <stdio.h>

extern "C" int Blah();

int main()
{
int a = Blah();
printf("%i\n", a);
system("pause");
return 0;
}

A następnie zdefiniowałem nic nie robiącą funkcję Blah w asmie w osobnym pliku blah.asm:
PROC_FRAME Blah
[endprolog]
mov eax, 0
ret
ENDPROC_FRAME

Yasm jest skonfigurowany prawidłowo, działa, plik blah.obj się generuje, razem z main.obj skompilowanym przez Visuala. Jednak wyskakuje błąd "error LNK2001: unresolved external symbol Blah". Próbowałem na siłę wrzucić blah.obj do command line'a linkera, jednak twierdzi że już taki plik jest już linkowany (domyślnie). Wygląda więc na to, że Yasm źle generuje plik obj. Co może być tego przyczyną? Jakieś pomysły?

Wszystko robiłem zgodnie z tym: http://www.sciencezero.org/index.php?title=How_to_write_x64_assembly_functions_in_Visual_C%2B%2B i z instrukcją do Yasm'a.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Rolek

  • Użytkownik

# Lipiec 31, 2012, 00:09:38
Spróbuj w asmie _Blah (z underscorem na początku).

Offline Witek9002

  • Użytkownik

# Lipiec 31, 2012, 00:47:18
Spróbuj w asmie _Blah (z underscorem na początku).
Próbowałem, ten sam efekt...

Offline yarpen

  • Użytkownik

# Lipiec 31, 2012, 01:14:58
Zarzuc objdump na blah.obj i zobacz jakie symbole tam faktycznie sa.

Offline Witek9002

  • Użytkownik

# Lipiec 31, 2012, 02:02:43
OK, pogrzebałem trochę w dokumentacji yasama i jakoś sobie poradziłem. Na pisałem po prostu:
global _Blah
_Blah:
mov eax, 0
ret
i działa. Tylko nie wiem czemu pod x86 muszę dawać underscore, a pod x64 nie.