2012-10-20 6 views
2

Je pratique la programmation de mixage C et assembleur en langage GCC. Et cette erreur occered:c appelle la fonction en langage assembleur

1 [email protected]:~/workspace/leos_test$ make 
2 ld -o deng c.o asm.o 
3 ld: warning: cannot find entry symbol _start; defaulting to 0000000008048074 
4 c.o: In function `main': 
5 c_and_asm.c:(.text+0x19): undefined reference to `add' 
6 c_and_asm.c:(.text+0x2e): undefined reference to `printf' 
7 make: *** [deng] Error 1 

Ceci est le code C:

1 #include<stdio.h> 
2 void extern add(int * i); 
3 void main(){ 
4 int i=1; 
5 add(&i); 
6 printf("%d ",i); 
7} 

Voici le code de langage assembleur:

1 .globl _add 
2 _add: 
3 push %bp; 
4 mov %sp,%bp; 
5 mov 0x4(%bp),%eax; 
6 incw (%eax); 
7 popw %bp; 
8 ret 

Voici le Makefile:

1 deng: c.o asm.o 
    2 ld -o deng c.o asm.o 
3 c.o: 
    4 gcc -o c.o -c c_and_asm.c 
5 asm.o: 
    6 as -o asm.o c_asm.asm 

Toute suggestion sera appréciée :).

Répondre

1

Changer votre fichier c_asm.asm à ceci:

.section .text 
.global add 
.type add,@function 
add: 
push %bp; 
mov %sp,%bp; 
mov 0x4(%bp),%eax; 
incw (%eax); 
popw %bp; 
ret 

inclure dans votre ld ce paramètre -lc et mieux changer le fichier avec l'extension .s

+0

Pourquoi avons-nous tant de code 16 bits dans le fichier asm? J'utiliserais '% esp','% ebp', 'incl', et' popl'! Je perds le commutateur '-c' et donne à gcc le fichier asm.o et le laisse invoquer ld pour toi. Si vous invoquez ld vous-même, en plus de '-lc', vous aurez besoin de' -I/lib/ld-linux.so.2', et '-melf_i386' si vous utilisez un système 64 bits (' -m32 'pour gcc). Si vous obtenez une mystérieuse erreur "fichier introuvable" lorsque vous exécutez votre chef-d'œuvre, essayez ce commutateur "-I" ... –

+0

Ceci est un copier coller à partir du corps de la question. Que ce soit un défi pour lui. Il en apprendra plus ... – memosdp

+0

Assez juste. Oublie ce que j'ai dit, Deng. :) –

1

Retirez le _ de _add et fixer .globl à global:

segment .text 
global add 

add: 
+0

avec GNU 'as' la syntaxe est très différente ... il n'y a pas de y 'segment' mot-clé et tous les mots-clés ont besoin d'un point avant ...' .align' '.global' ... – memosdp

+0

@memosdp - merci, je ne le savais pas. – MByD

+0

Merci aussi pour votre aide. –

Questions connexes