2016-12-08 5 views
2

Ich versuche, eine Assembly-Funktion aufzurufen, die mit NASM aus einer einfachen C-Treiber-Klasse kompiliert wurde, die mit MinGW GCC kompiliert wurde.Interfacing Assembly mit C

Ich verwende die folgenden Befehle, um die Dateien zu kompilieren und zu assemblieren.

nasm -f win32 asm_main.asm -o asm.o 

gcc -c driver.c -o driver.o 

und den folgenden Befehl, um sie miteinander zu verknüpfen.

ld.exe asm.o driver.o -L"C:\Windows\SysWOW64" -lkernel32 -luser32 -o app.exe 

erhalte ich die Fehlermeldung:

driver.o:driver.c:(.text+0x7): undefined reference to `__main' 

Hier ist meine Probe Montage und C-Code

; asm.asm 
extern _MessageBoxA, _ExitProcess 

section .data 
    title db "Greeting", 0 
    message db "Hello World!", 0 
section .bss 

section .text 
    global _asm_main 

_asm_main: 
    enter 0, 0 

    push dword 0 
    push dword title 
    push dword message 
    push dword 0 
    call _MessageBoxA 

    push dword 0 
    call _ExitProcess 

    mov eax, 0 
    leave 
    ret 

// driver.c 
extern int asm_main(); 


void main() 
{ 
    asm_main(); 
} 

Alle darüber nachgedacht, warum ich diesen Fehler bekommen könnte ? Danke.

UPDATE: Ich habe mein Problem gelöst, indem Exitprocess zu _ExitProcess @ 4 und MessageBox _MessageBoxA @ 16 zu ändern und die Verknüpfung mit gcc.

Antwort

1

Sie verpassen die gcc C-Startroutine __main (aufgerufen von main, wenn Sie mit gcc kompilieren), die normalerweise in libgcc definiert ist. Der einfachste Weg, um es zu bekommen, ist mit gcc (die es enthält) zu verknüpfen, anstatt ld. Alternativ fügen Sie -lgcc der Verbindungsbefehlszeile hinzu.

+0

Ich versuchte gcc und bekam eine andere Reihe von Fehlern: c:/mingw/bin/../lib/gcc/mingw32/4.9.3 /../../../ libmingw32.a (tlsthrd.o) :(. text + 0x218): undefinierter Verweis auf 'InitializeCriticalSection @ 4 'c:/mingw/bin/../ lib/gcc/mingw32/4.9.3 /../../../ libmingwex.a (misc.o) :(. text + 0x67): undefinierter Verweis auf 'InitializeCriticalSection @ 4 ' – Ian

+0

@Ian, du musst dann eine Verknüpfung zu win32 oder etwas hinzufügen. Versuchen Sie, '-lwin32' hinzuzufügen. Wenn das nicht funktioniert, ist es zumindest ein Hinweis! Sie vermissen einige grundlegende Windows-Bibliothek. –