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.