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.
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
@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. –