Avatar billede krismort Nybegynder
16. februar 2005 - 21:13 Der er 11 kommentarer og
1 løsning

MSVC vs. MASM

Hvorfor giver følgende denne linker fejl ?
unresolved external symbol _cppfunc referenced in function _asmfunc
Jeg bruger MSVC7.1 og MASM 8.x ...

-------- cppfunc.cpp -----------
extern "C" long asmfunc(long arg1);
void main(){
  asmfunc(1);
}

long cppfunc(long arg1) {
  return 1;
}
--------------------------------


-------- asmfunc.asm -----------
.386
.model flat, C
.code
cppfunc proto arg:DWORD
asmfunc proc, arg1:DWORD
  invoke cppfunc, 1
  ret
asmfunc endp
end
--------------------------------


Jeg tror nu mest at spm burde lyde på hvordan definerer jeg en prototype i (m)asm til en funktion skrevet i cpp hvis den ser sådan her ud

long cppfunc(long arg1) {
  return 0;
}

hvilken kalde konvension bruges der som default ? stdcall ? eller cdecl ?
Kan det være det som er galt da jeg definerer prototypen i (m)asm ?  Altså forkert angivet kalde konvension ?

mvh.
  Kristian Mortensen
Avatar billede arne_v Ekspert
16. februar 2005 - 21:22 #1
cdecl må være default i C/C++
Avatar billede arne_v Ekspert
16. februar 2005 - 21:23 #2
Skal du ikke have:

extern "C"

på cppfunc også ?
Avatar billede arne_v Ekspert
16. februar 2005 - 21:24 #3
Ellers laver C++ jo name mangling for at supportere function overload.
Avatar billede krismort Nybegynder
16. februar 2005 - 22:01 #4
nej jeg skal ikke have extern "C" på cppfunc... læg mærke til at det der gerne skulle ske er at main kalder asmfunc som kalder cppfunc.. Jeg kan sagtens skrive en funktion i asm og kalde den fra et cpp program ... det som er problemet er det omvendte. altså skrive en funktion i cpp og kalde fra et asm program.

hvordan skal jeg stille prototypen op for i mit asm dokuement for cpp funktionen:

long helloworld( long helloworld, long helloworld ) {
}
Avatar billede krismort Nybegynder
16. februar 2005 - 22:02 #5
( Der er ikke noget som hedder "extern" i asm )
Avatar billede arne_v Ekspert
16. februar 2005 - 22:03 #6
Jeg synes altså at du skulle prøve:

-------- cppfunc.cpp -----------
extern "C" long asmfunc(long arg1);
void main(){
  asmfunc(1);
}

extern "C" long cppfunc(long arg1);

long cppfunc(long arg1) {
  return 1;
}
Avatar billede arne_v Ekspert
16. februar 2005 - 22:04 #7
Og jeg har forstået hvad der kalder hvad.
Avatar billede krismort Nybegynder
16. februar 2005 - 22:43 #8
nice det virker med

extern "C" long cppfunc(long arg1);
long cppfunc(long arg1) {
  return 1;
}

istedet for:
long cppfunc(long arg1) {
  return 1;
}

hvad er det
extern "C" long cppfunc(long arg1);
fortæller compileren ?
Avatar billede arne_v Ekspert
16. februar 2005 - 22:45 #9
Den fortæller C++ compileren at navnet cppfunc skal bevares som det er (C style)
og ikke som man gør med C++ funktions navne tilføje oplysninger om argumenter for
at understøtte function overloading.
Avatar billede arne_v Ekspert
16. februar 2005 - 22:51 #10
Den oprindelige version bliver compilet til:

.globl __Z7cppfuncl
    .def    __Z7cppfuncl;    .scl    2;    .type    32;    .endef
__Z7cppfuncl:
LFB2:
    pushl    %ebp
LCFI4:
    movl    %esp, %ebp
LCFI5:
    movl    $1, %eax
    popl    %ebp
    ret

mens den modificered version bliver compilet til:

.globl _cppfunc
    .def    _cppfunc;    .scl    2;    .type    32;    .endef
_cppfunc:
LFB2:
    pushl    %ebp
LCFI4:
    movl    %esp, %ebp
LCFI5:
    movl    $1, %eax
    popl    %ebp
    ret

g++ (GNU C++) som outputter AT&T syntax assembler så du kan ikke
umiddelbart sammenligne med MS VC++ og MASM, men forskellen i navn
må være ret klar
Avatar billede arne_v Ekspert
17. februar 2005 - 22:10 #11
og et svar
Avatar billede krismort Nybegynder
19. februar 2005 - 10:53 #12
godt gået....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester