/***************************************************************************/
/* DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE */
/* Version 3, April 2009 */
/* */
/* Copyleft meh. */
/* */
/* DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE */
/* TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION */
/* */
/* 0. You just DO WHAT THE FUCK YOU WANT TO. */
/* 1. ???? */
/* 2. PROFIT */
/***************************************************************************/
/* DO WHAT YOU WANT CAUSE A PIRATE IS FREE, YOU ARE A PIRATE! */
/***************************************************************************/
.data
random_32: .long 0x23421337
.text
/* int __isdigit (char ch) */
__isdigit:
push %ebp
mov %esp, %ebp
xorl %eax, %eax
cmpb $0x30, 8(%ebp)
jl __isdigit_end
cmpb $0x39, 8(%ebp)
jg __isdigit_end
movl $1, %eax
__isdigit_end:
pop %ebp
ret
/* string.h */
/* int __strlen (char* str) */
__strlen:
push %ebp
movl %esp, %ebp
push %edi
push %ecx
movl 8(%ebp), %edi
xorl %eax, %eax
xorl %ecx, %ecx
notl %ecx
cld
repne scasb
notl %ecx
decl %ecx
movl %ecx, %eax
pop %ecx
pop %edi
pop %ebp
ret
/* char* __strchr (char* str, char ch) */
__strchr:
push %ebp
movl %esp, %ebp
push %edi
push %ebx
push %ecx
push 8(%ebp)
call __strlen
addl $4, %esp
movl %eax, %ebx
incl %ebx
movl %eax, %ecx
addl $2, %ecx
movl 8(%ebp), %edi
movzbl 12(%ebp), %eax
cld
repne scasb
cmp $0, %ecx
je __strchr_error
movl 8(%ebp), %eax
subl %ecx, %ebx
addl %ebx, %eax
jmp __strchr_end
__strchr_error:
xorl %eax, %eax
__strchr_end:
pop %ecx
pop %ebx
pop %edi
pop %ebp
ret
/* char* strcpy (char* dest, const char* src) */
__strcpy:
push %ebp
movl %esp, %ebp
push %ebx
push %ecx
push %edx
push 12(%ebp)
call __strlen
add $4, %esp
movl %eax, %ecx
incl %ecx
movl 8(%ebp), %ebx
movl 12(%ebp), %edx
__strcpy_loop:
movzbl (%edx), %eax
movb %al, (%ebx)
incl %edx
incl %ebx
loop __strcpy_loop
movl 8(%ebp), %eax
pop %edx
pop %ecx
pop %ebx
pop %ebp
ret
/* char* strncpy (char* dest, const char* src, int n) */
__strncpy:
push %ebp
movl %esp, %ebp
push %ebx
push %ecx
push %edx
movl 8(%ebp), %ebx
movl 12(%ebp), %edx
movl 16(%ebp), %ecx
__strncpy_loop:
movzbl (%edx), %eax
movb %al, (%ebx)
cmpb $0, %al
je __strncpy_fill_zero
incl %edx
incl %ebx
loop __strncpy_loop
jmp __strncpy_end
__strncpy_fill_zero:
movb $0, (%ebx)
incl %ebx
loop __strncpy_fill_zero
__strncpy_end:
movl -4(%ebx), %eax
pop %edx
pop %ecx
pop %ebx
pop %ebp
ret
/* stdlib.h */
/* int __rand (void) */
__rand:
push %edx
movl random_32, %eax
movl $0x0019660D, %edx
mull %edx
addl $0x3C6EF35F, %eax
movl %eax, random_32
pop %edx
ret
/* int __atoi (char* str) */
__atoi:
push %ebp
movl %esp, %ebp
/* is_negative @ -4(%ebp) */
sub $4, %esp
push %ebx
push %ecx
push %edx
movl 8(%ebp), %ecx
cmpb $'-', (%ecx)
je __atoi_neg
cmpb $'+', (%ecx)
je __atoi_pos
jmp __atoi_P1
__atoi_neg:
movl $1, -4(%ebp)
incl %ecx
jmp __atoi_P1
__atoi_pos:
movl $0, -4(%ebp)
incl %ecx
__atoi_P1:
push (%ecx)
call __isdigit
addl $4, %esp
cmp $0, %eax
je __atoi_end
xorl %ebx, %ebx
xorl %edx, %edx
movb (%ecx), %dl
subb $0x30, %dl
movl %edx, %ebx
incl %ecx
__atoi_loop:
push (%ecx)
call __isdigit
addl $4, %esp
cmp $0, %eax
je __atoi_loop_end
movl $10, %eax
mull %ebx
movl %eax, %ebx
movzbl (%ecx), %edx
subb $0x30, %dl
addl %edx, %ebx
incl %ecx
jmp __atoi_loop
__atoi_loop_end:
movl %ebx, %eax
cmp $1, -4(%ebp)
jne __atoi_end
neg %eax
__atoi_end:
pop %edx
pop %ecx
pop %ebx
addl $4, %esp
pop %ebp
ret
/* void* __memset (void* s, char c, unsigned n) */
__memset:
push %ebp
movl %esp, %ebp
push %ebx
push %ecx
push %edx
movl 16(%ebp), %ecx
movzbl 12(%ebp), %ebx
movl 8(%ebp), %edx
__memset_loop:
movb %bl, (%edx)
incl %edx
loop __memset_loop
movl 8(%ebp), %eax
pop %edx
pop %ecx
pop %ebx
pop %ebp
ret
/* void* __memcpy (void* dest, const void* src, unsigned n) */
__memcpy:
push %ebp
movl %esp, %ebp
push %ebx
push %ecx
push %edx
movl 16(%ebp), %ecx
movl 12(%ebp), %ebx
movl 8(%ebp), %edx
__memcpy_loop:
movb (%ebx), %al
movb %al, (%edx)
incl %ebx
incl %edx
loop __memcpy_loop
movl 8(%ebp), %eax
pop %edx
pop %ecx
pop %ebx
pop %ebp
ret
/* arpa/inet.h */
/* short __htons (short port) */
/* ((n & 0xFF) << 8) | ((n & 0xFF00) >> 8) */
__htons:
push %ebp
movl %esp, %ebp
push %edx
xorl %eax, %eax
movw 8(%ebp), %ax
andw $0xff, %ax
salw $8, %ax
movw %ax, %dx
movw 8(%ebp), %ax
andw $0xff00, %ax
sarw $8, %ax
orw %dx, %ax
pop %edx
pop %ebp
ret
/* int __htonl (int port) */
/* ((n & 0xFF) << 24) | ((n & 0xFF01) << 8) | ((n & 0xFF0000) >> 8) | ((n & 0xFF000000) >> 24) */
__htonl:
push %ebp
movl %esp, %ebp
push %edx
movl 8(%ebp), %eax
andl $0xff, %eax
sall $24, %eax
movl %eax, %edx
movl 8(%ebp), %eax
andl $0xff00, %eax
sall $8, %eax
orl %eax, %edx
movl 8(%ebp), %eax
andl $0xff0000, %eax
sarl $8, %eax
orl %eax, %edx
movl 8(%ebp), %eax
andl $0xff000000, %eax
sarl $24, %eax
orl %edx, %eax
pop %edx
pop %ebp
ret
/* int __inet_addr (char* address) */
/* a.b.c.d <=> (a << 24) | (b << 16) | (c << 8) | d */
__inet_addr:
push %ebp
movl %esp, %ebp
/* str_end @ -4(%ebp) */
sub $4, %esp
push %ebx
push %ecx
push %edx
push 8(%ebp)
call __strlen
addl $4, %esp
/* str_end @ -16(%ebp) */
movl 8(%ebp), %edx
movl %edx, -4(%ebp)
addl %eax, -4(%ebp)
xorl %ebx, %ebx
movl 8(%ebp), %ecx
__inet_addr_loop:
push (%ecx)
call __isdigit
addl $4, %esp
cmp $0, %eax
je __inet_addr_check_dot
jmp __inet_addr_loop_continue
__inet_addr_check_dot:
cmpb $'.', (%ecx)
jne __inet_addr_error
cmp $3, %ebx
jge __inet_addr_error
incl %ebx
__inet_addr_loop_continue:
incl %ecx
cmpl %ecx, -4(%ebp)
je __inet_addr_loop_end /* if (end of string reached) end loop */
jmp __inet_addr_loop
__inet_addr_loop_end:
movl 8(%ebp), %ecx
xorl %ebx, %ebx
/* Check first number */
push %ecx
call __atoi
addl $4, %esp
cmp $255, %eax
jg __inet_addr_error
sall $24, %eax
movl %eax, %ebx
push $'.'
push %ecx
call __strchr
addl $8, %esp
movl %eax, %ecx
incl %ecx
/* Check second number */
push %ecx
call __atoi
addl $4, %esp
cmp $255, %eax
jg __inet_addr_error
sall $16, %eax
orl %eax, %ebx
push $'.'
push %ecx
call __strchr
addl $8, %esp
movl %eax, %ecx
incl %ecx
/* Check third number */
push %ecx
call __atoi
addl $4, %esp
cmp $255, %eax
jg __inet_addr_error
sall $8, %eax
orl %eax, %ebx
push $'.'
push %ecx
call __strchr
addl $8, %esp
movl %eax, %ecx
incl %ecx
/* Check last number */
push %ecx
call __atoi
addl $4, %esp
cmp $255, %eax
jg __inet_addr_error
orl %eax, %ebx
movl %ebx, %eax
bswap %eax
jmp __atoi_end
__inet_addr_error:
mov $-1, %eax
__inet_addr_end:
pop %edx
pop %ecx
pop %ebx
addl $4, %esp
pop %ebp
ret