calling assembly function from c-Collection of common programming errors

I’m trying to call an assembly function from c,but i keep getting errors.

    .text
    .globl integrate
    .type integrate, @function
integrate:
    push %ebp
    mov %esp, %ebp
    mov $0,%edi
start_loop:                
    cmp %edi,1024           
    je loop_exit
    mov 8(%ebp),%eax          
    mov 12(%ebp),%ecx          
    sub %eax,%ecx              
    add %edi,%ecx
    incl %edi                
    jmp start_loop             
loop_exit:                 
    movl %ebp, %esp
    popl %ebp
    ret   

This is my assembly function,file called integrate.s.

#include 

extern int integrate(int from,int to);

void main()
{
    printf("%d",integrate(1,10));
}

Heres my c code.

function.c:5:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
/tmp/cciR63og.o: In function `main':
function.c:(.text+0x19): undefined reference to `integrate'
collect2: ld returned 1 exit status

Whenever i try to compile my code with gcc -Wall function.c -o function,it gives the ‘undefined reference to integrate’ error.I also tried adding link to the integrate.s file from c,like

#include

but it didnt work as well.Btw what assembly code is doing is not important,for now im just trying to call the function from c successfully.Can anyone help me about solving this problem ?

  1. warning: return type of ‘main’ is not ‘int’

    means that the return type of ‘main’ is not ‘int’… Change it to int, then:

    int main()
    {
    }
    

    Also, to solve the linker error, invoke GCC as

    gcc -o myprog main.c integrate.s
    

    and that should work.

  2. I see the following problems with the code:

    • calling convention mandates you must preserve the value of edi
    • cmp %edi,1024 is using 1024 as address and will probably fault. You want cmp $1024,%edi for comparing with an immediate number
    • you are reloading eax and ecx from the arguments each iteration so the calculation you perform has no effect
    • you don’t seem to put any sensible return value into eax (it will return the value of from that was passed in)

    The first two points apply even if “what assembly code is doing is not important”.

Originally posted 2013-11-10 00:16:56.