2012-10-20 95 views
2

我正在使用GCC練習C語言和彙編語言混合編程。而這個錯誤occered:c調用匯編語言編寫的函數

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 

這是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} 

這裏是彙編語言代碼:

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 

這是生成文件:

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 

任何建議將不勝感激:)。

回答

1

更改c_asm.asm文件,以這樣的:

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

包括在你的LD此參數-lc,更好地更改文件擴展到.s

+0

爲什麼我們在asm文件中有這麼多的16位代碼?我會用'%esp','%ebp','incl'和'popl'!我會失去'-c'開關並給​​gcc asm.o文件,並讓它爲ld調用ld。如果你自己調用ld,除'-lc'之外,如果你在64位系統上('-m32),你可能需要'-I/lib/ld-linux.so.2'和'-melf_i386' '爲gcc)。如果在運行傑作時發現了一個神祕的「文件未找到」錯誤,請嘗試使用'-I'開關... –

+0

這是來自問題主體的複製粘貼。讓他成爲他的挑戰吧。他會學到更多... – memosdp

+0

夠公平的。忘了我說的,鄧。 :) –

1

取出__add和修復.globlglobal

segment .text 
global add 

add: 
+0

與GNU'as'的語法是非常不同的......沒有一個y'segment'關鍵字和所有關鍵字需要一個點之前...'.align'' .global' ... – memosdp

+0

@memosdp - 謝謝,我不知道。 – MByD

+0

也感謝您的幫助。 –