Hello, I was trying to write the send() system call of net/socket.h in inline assembly. I am using gcc 4.2.3. I managed to write it for socket(). But using similar technique for doing a send does not seem to be working.
My socket inline code was

//	socket(AF_INET,SOCK_STREAM,0); AF_INET = 2, SOCK_STREAM = 1. 
 __asm__("sub  $12,%%esp\n"
        "movl   $2,(%%esp)\n"
        "movl   $1,4(%%esp)\n"
        "movl   $0,8(%%esp)\n"
        "movl   $102,%%eax\n"
        "movl   $1,%%ebx\n"
        "movl   %%esp,%%ecx\n"
        "int    $0x80\n"
        "add    $12,%%esp\n"
        : "=a" (s)
       );

The code I wrote for send was -

strcpy(buf, "hello");
 ptr = &buf;
 // assembly code for send with interrupt
 // send(sockD, buf, 6, 0);
 __asm__("sub  $16,%%esp\n"
        "movl   %%ebx,(%%esp)\n"
        "movl   %%ecx,4(%%esp)\n"
        "movl   $6,8(%%esp)\n"
        "movl   $0,12(%%esp)\n"
        "movl   $102,%%eax\n"
        "movl   $16,%%ebx\n"
        "movl   %%esp,%%ecx\n"
        "int    $0x80\n"
        "add    $16,%%esp\n"
        : "=a" (s)
        :"b"(sockD), "c"(*ptr)
       );

It returns a negative value. Can someone help me out on this? I looked at net.h header file and I got the call numbers for functions within sys_socketcall as

#define SYS_SOCKET      1               /* sys_socket(2)                */
#define SYS_BIND        2               /* sys_bind(2)                  */
#define SYS_CONNECT     3               /* sys_connect(2)               */
#define SYS_LISTEN      4               /* sys_listen(2)                */
#define SYS_ACCEPT      5               /* sys_accept(2)                */
#define SYS_GETSOCKNAME 6               /* sys_getsockname(2)           */
#define SYS_GETPEERNAME 7               /* sys_getpeername(2)           */
#define SYS_SOCKETPAIR  8               /* sys_socketpair(2)            */
#define SYS_SEND        9               /* sys_send(2)                  */
#define SYS_RECV        10              /* sys_recv(2)                  */
#define SYS_SENDTO      11              /* sys_sendto(2)                */
#define SYS_RECVFROM    12              /* sys_recvfrom(2)              */
#define SYS_SHUTDOWN    13              /* sys_shutdown(2)              */
#define SYS_SETSOCKOPT  14              /* sys_setsockopt(2)            */
#define SYS_GETSOCKOPT  15              /* sys_getsockopt(2)            */
#define SYS_SENDMSG     16              /* sys_sendmsg(2)               */
#define SYS_RECVMSG     17              /* sys_recvmsg(2)               */

That is how I place $1 in the ebx register while making the socket() call, while I placed 16 in the EBX register while making the send() call. Is it because 'Hello' is 6 bytes and I am placing it on stack which is causing some overflow?
Thanks in advance.

thanks. I resolved it. parameter 16 for sys_socketcall was for sendmsg. It turned out that my code worked fine for send() which was parameter 9 for sys_socketcall.

This article has been dead for over six months. Start a new discussion instead.