2 votes

Interfacer l'Assemblée avec le C

J'essaie d'appeler une fonction assembleur assemblée avec NASM à partir d'une simple classe pilote C compilée avec MinGW GCC.

J'utilise les commandes suivantes pour compiler et assembler les fichiers.

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

gcc -c driver.c -o driver.o

et la commande suivante pour les relier entre eux.

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

Je reçois le message d'erreur :

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

Voici mon exemple de code assembleur et de code C

; 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(); 
}

Vous avez une idée de la raison pour laquelle je pourrais obtenir cette erreur ? Merci.

UPDATE : J'ai résolu mon problème en remplaçant ExitProcess par _ExitProcess@4 et MessageBox par _MessageBoxA@16 et en établissant un lien avec gcc.

1voto

Chris Dodd Points 39013

Il vous manque la routine de démarrage de gcc C. __main (appelé par main lorsque vous compilez avec gcc), qui est généralement défini dans libgcc. La manière la plus simple de l'obtenir est de lier avec gcc (qui l'inclut) plutôt qu'avec ld. Alternativement, ajoutez -lgcc à la ligne de commande du lien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X